14

テーブル b (room_id、room_start、room_finish) に対応するイベントがないテーブル a (id、room_name) からの値の選択に問題があります。

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

SELECT ID, room_name FROM 部屋
存在しない場所
(SELECT * FROM room_events
    WHERE room_start BETWEEN '1294727400' と '1294729200'
          また
          room_finish BETWEEN '1294727400' と '1294729200')

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

4

2 に答える 2

29

やりたいことのプロトタイプは次のとおりです。

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'

そうでない場合は、犯人を見つけて、それに応じて他の部分で行動してください:)

于 2011-01-11T18:00:08.417 に答える
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')
于 2011-01-11T18:01:49.297 に答える