Подтвердить что ты не робот

Mysql: выберите все элементы из таблицы A, если они не существуют в таблице B

У меня возникла проблема с выбором значений из таблицы 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')

table a содержит несколько комнат, таблица b содержит события комнаты Я не получаю никаких результатов в случае, если есть какое-либо событие для любого из номеров в метках времени. Я ожидаю, что во всех комнатах нет событий.

4b9b3361

Ответ 1

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

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'

Если это не так, вы нашли преступника и действуете соответственно с другими частями:)

Ответ 2

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

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