好吧,我有两张桌子:
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
; 使用此数据集,只会返回ID为5
和6
的事件。
怎么做?
我试过这样:
SELECT *
FROM `events`
JOIN `trip_events`
ON (`trip_events`.`event_id` = `events`.`id`)
WHERE `trip_events`.`event_id` != `events`.`id`
但它不起作用。
答案 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)