2011-01-11 48 views
12

我在表b(room_id,room_start,room_finish)中没有相应事件的表a(id,room_name)中选择值的问题mysql:如果表B中不存在,则选择表A中的所有项目

我的查询看起来如下

 
SELECT id, room_name FROM rooms 
WHERE NOT EXISTS 
(SELECT * FROM room_events 
    WHERE room_start BETWEEN '1294727400' AND '1294729200' 
      OR 
      room_finish BETWEEN '1294727400' AND '1294729200') 

表中包含多个房间,表b包含房事件 我越来越没有结果的情况下,对于任何的时间戳内房间的任何事件。我期待所有房间没有事件。

回答

22

这里是原型,你想做什么:

SELECT * FROM table1 t1 
    WHERE NOT EXISTS (SELECT 1 FROM table2 t2 WHERE t1.id = t2.id) 

这里,id被认为是两个表中的PK和FK。你应该相应地调整。还要注意,在这种情况下比较PK和FK非常重要。

所以,这里是你的查询应该如何看起来像:

SELECT id, room_name FROM rooms r 
WHERE NOT EXISTS 
(SELECT * FROM room_events re 
    WHERE 
      r.room_id = re.room_id 
      AND 
      (
      room_start BETWEEN '1294727400' AND '1294729200' 
      OR 
      room_finish BETWEEN '1294727400' AND '1294729200') 
     ) 

如果你想,你在mysql客户端执行这些检查查询的部分。例如,你可以确保如果下面的返回任何记录或不:

SELECT * FROM room_events 
    WHERE room_start BETWEEN '1294727400' AND '1294729200' 
      OR 
      room_finish BETWEEN '1294727400' AND '1294729200' 

如果没有的话,你已经找到了罪魁祸首,并与其他部件:)

+0

谢谢你,它做的工作,我想我忘了把括号,而尝试。 – m1k3y3 2011-01-11 18:10:48

0

你缺少相应采取行动只使用该房间的事件。这是通过匹配id完成的。

SELECT id, room_name FROM rooms r 
WHERE NOT EXISTS 
(SELECT * FROM room_events re 
     WHERE r.id = re.room_id AND 
     room_start BETWEEN '1294727400' AND '1294729200' 
     OR 
     room_finish BETWEEN '1294727400' AND '1294729200') 
+0

我还没有得到任何结果:-( – m1k3y3 2011-01-11 18:09:09

相关问题