web-dev-qa-db-ja.com

mysql:テーブルBに存在しない場合は、テーブルAからすべてのアイテムを選択します

テーブルb(room_id、room_start、room_finish)に対応するイベントがないテーブルa(id、room_name)から値を選択する際に問題が発生しました

私のクエリは次のようになります

 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')

テーブルaには複数の部屋が含まれ、テーブルbには部屋のイベントが含まれています。タイムスタンプ内のいずれかの部屋にイベントがある場合、結果は得られません。すべての部屋にイベントがないことを期待しています。

14
m1k3y3

これがあなたがやりたいことのプロトタイプです:

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'

そうでない場合は、原因を見つけて、他の部分に応じて行動します:)

26
Sarfraz

その部屋のイベントだけを使用することができません。これは、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