Как выбрать результаты из таблицы № 1, отфильтрованные по результатам в таблице № 2? - PullRequest
0 голосов
/ 30 декабря 2011

Ну, у меня есть две таблицы:

  • events: id, title, description
  • trip_events: id, event_id (указывает на events. id)

Мне нужно выбрать результаты из таблицы с именем events.

SELECT *
FROM `events`

Просто так, верно?

Мне нужно добиться того, чтобы мне нужно было выбирать результаты из events, но исключить те строки, которые находятся в trip_events (если events. id! = trip_events. event_idисключено).

Вот пример:

events:

  • id: 5,
  • id: 6,
  • id: 7,
  • id: 8;

trip_events:

  • event_id: 6,
  • event_id: 8;

С этим набором данных только события с идентификатором 5и 6 будет возвращено.

Как это сделать?

Я пытался так:

SELECT *
FROM `events`
JOIN `trip_events`
ON (`trip_events`.`event_id` = `events`.`id`)
WHERE `trip_events`.`event_id` != `events`.`id`

Но это не сработало.

Ответы [ 4 ]

5 голосов
/ 30 декабря 2011
select * from events where id not in
(select event_id from trip_events)

Edit:
Как примечание стороны, условие ON можно рассматривать как условие WHERE. Результат вашего запроса будет таким же, как следующий

SELECT *
FROM `events`
JOIN `trip_events`
ON 1 = 1
WHERE (`trip_events`.`event_id`  = `events`.`id`)
AND   (`trip_events`.`event_id` != `events`.`id`)

Угадай, почему ты не получишь никаких результатов!

3 голосов
/ 30 декабря 2011

Другой способ решения этой проблемы (использование левого соединения вместо подвыбора):

SELECT events.id from events
    LEFT JOIN trip_events on events.id = trip_events.event_id
    WHERE trip_events.event_id is null;

В некоторых случаях это может быть лучше, чем вариант с подвыбором, предложенный @ Albin Sunnanbo изс точки зрения производительности, это зависит от того, какой сервер SQL вы используете (некоторые серверы выполняют лучшую оптимизацию, в обоих случаях оба варианта обеспечивают одинаковую производительность).

2 голосов
/ 30 декабря 2011
select * 
from events e 
where not exists (
    select 1 from trip_events t 
    where t.event_id = e.id
)
1 голос
/ 30 декабря 2011

Попробуйте ниже Запрос:

ВЫБРАТЬ * ИЗ events ГДЕ идентификатор не указан (выберите event_id из trip_events)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...