2015-03-31 46 views
0

我得到了2个表格,我保留位置信息和人员位置。我想找到那些没有离开这个地方的人。所以我在这两个表中都有客户端ID和位置ID。在我的位置表中,我知道哪个地方在外面。下面的查询给了我里面的人。如果我使isOutside = 1,它给了我外面的人。所以问题是,一个人可以有条目,其中isOutside等于1或0。我怎么能区分谁拥有isOutside值为0,但没有任何人进入其中isOutside等于1根据列值不同,在表格中不存在任何其他条目

SELECT DISTINCT(macID) 
FROM locations a, logs b 
WHERE b.location_id = a.id and b.client_id=1 and Date(b.lastLocatedTime) = '2015-01-16' 
and a.isOutside =0 and b.client_id = a.client_id 

更新

我写了这个查询哪些为我工作。这与波希米亚的答案类似。

SELECT COUNT(DISTINCT macID) 
FROM logs 
WHERE location_id IN (SELECT id FROM locations WHERE isOutside = 0) AND client_id = 1 AND 
         DATE(lastLocatedTime) = '2015-01-16' AND macID NOT IN 
         (SELECT macID 
         FROM logs 
         WHERE DATE(lastLocatedTime) = '2015-01-16' AND 
         location_id IN (SELECT id FROM locations WHERE isOutside = 1)) 

回答

0

使用NOT IN测试:

SELECT DISTINCT(macID) 
FROM locations a 
JOIN logs b ON a.id = b.location_id AND a.client_id = b.client_id 
WHERE b.client_id=1 and Date(b.lastLocatedTime) = '2015-01-16' 
AND a.client_id NOT IN (SELECT client_id FROM locations WHERE isOutside = 1) 
+0

然而,我试过这个,即使它没有显示有isOutside值为0的人,但这并不意味着他们在表中没有isOutside值为0。 – 2015-03-31 07:33:28

0

使用左连接外人并过滤掉连接,只留下业内人士:

SELECT DISTINCT l.macID 
FROM logs l 
JOIN locations a ON l.location_id = a.id 
    AND l.client_id = a.client_id 
    AND a.isOutside = 0 
LEFT JOIN (SELECT macId, l2.client_id, date(lastLocatedTime) lastLocatedDate 
      FROM logs l2 
      JOIN locations a2 ON l2.location_id = a2.id 
      AND l2.client_id = a2.client_id 
      AND a2.isOutside = 1) o 
    ON o.client_id = l.client_id 
    AND o.macID = l.macID 
    AND lastLocatedDate = Date(l.lastLocatedTime) 
WHERE Date(l.lastLocatedTime) = '2015-01-16' 
AND o.client_id IS NULL 
AND l.client_id = 1 

SQLFiddle

这里,日志是内部加入到位置找到所有内部人员,但后来外部连接d给外人,如果找不到将包含where子句选择的所有空值(拒绝成功的加入)。

另外DISTINCT不是一个函数,所以不要编码为一个;即DISTINCT macID,而不是DISTINCT(macID)

+0

İt只显示所有的macids,它没有得到行只有isOutside值0 – 2015-03-31 07:43:25

+0

@AhmetTanakol好,它*应该*的工作。你确定你确实抄袭了我的查询吗?特别是连接类型(“连接”,然后“左连接”)。如果你有正确的拷贝我的查询,并且它确实不起作用,请用你的模式和一些示例数据创建一个[SQLFiffle](http://sqlfiddle.com)。 – Bohemian 2015-03-31 18:46:09

+0

@Bohemianyes我复制完全你的查询。我认为,当你加入地点和日志时,它会得到所有isOutside值为0的人,但是在你离开后,它并不会消除那些是“Outside”值为1.你在离开之前创建的单元格仍然可以有条目在第二个单元格中。 – 2015-04-01 06:16:58

相关问题