2011-01-11 65 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

相關問題