mysql: выбрать все элементы из таблицы A, если их нет в таблице B - PullRequest
14 голосов
/ 11 января 2011

У меня проблема с выбором значений из таблицы a (id, room_name), где в таблице b нет соответствующих событий (room_id, room_start, room_finish)

мой запрос выглядит следующим образом

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 содержит события комнаты Я не получаю никаких результатов в случае, если есть какое-либо событие для любой из комнат в пределах временных отметок. Я ожидаю, что во всех номерах нет событий.

Ответы [ 2 ]

26 голосов
/ 11 января 2011

Вот прототип того, что вы хотите сделать:

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 голосов
/ 11 января 2011

Вам не хватает использовать только события из этой комнаты. Это делается путем сопоставления идентификатора.

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