如何选择表#1中的结果按表#2中的结果过滤?

时间:2011-12-30 08:44:06

标签: mysql sql join filter

好吧,我有两张桌子:

  • eventsidtitledescription
  • trip_eventsidevent_id(指向eventsid

我需要从名为events的表中选择结果。

SELECT *
FROM `events`

简单,对吧?

我需要实现的是,我需要从events中选择结果,但排除trip_events中的行(如果eventsid!= trip_eventsevent_id排除在外。)

以下是示例:

events

  • id5
  • id6
  • id7
  • id8;

trip_events

  • event_id6
  • event_id8;

使用此数据集,只会返回ID为56的事件。

怎么做?

我试过这样:

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

但它不起作用。

4 个答案:

答案 0 :(得分:5)

select * from events where id not in
(select event_id from trip_events)

修改
作为旁注,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`)

猜猜为什么你没有得到任何结果!

答案 1 :(得分:3)

解决此问题的另一种方法(使用左连接而不是子选择):

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从性能点提出的subselect更好,它取决于您使用的SQL服务器(某些服务器在这种情况下执行更好的优化,两种变体提供相同的性能)

答案 2 :(得分:2)

select * 
from events e 
where not exists (
    select 1 from trip_events t 
    where t.event_id = e.id
)

答案 3 :(得分:1)

尝试以下查询:

SELECT *     来自events     WHERE id in(从trip_events中选择event_id)