给定以下架构和数据:
create table contacts (id int, name varchar(255));
create table events (id int, name varchar(255));
create table tickets (contact_id int, event_id int);
insert into contacts (id, name) values (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');
insert into events (id, name) values (1, 'Event 1'), (2, 'Event 2');
insert into tickets (contact_id, event_id) values (1,1), (1,2);
insert into tickets (contact_id, event_id) values (2,2);
我如何找到刚参加过一项活动的人?我希望只能找到只参加过一项赛事的鲍勃,而不是去过两次赛事的爱丽丝,而不是参加零级赛事的查理。
潜在地可能有数百个联系人和事件,我想为某个特定事件找到那些以前从未参加过任何事件的联系人。
我正在为此空白。
编辑:让我澄清一下,
我如何找到刚参加过一项特定活动的人?对于事件2,我希望只找到只参加过一个事件的鲍勃,而不是去过两次的爱丽丝,而不是去过零的查理。
最佳答案
@yang的答案适用于仅参加过一个非特定事件的用户,但是,如果您想查找参加特定活动的用户作为他们的第一个也是唯一一个,则如果tickets.event_id
不能为NULL
,则此方法有效:
SELECT t1.contact_id
FROM tickets t1
LEFT JOIN tickets t2
ON t2.contact_id = t1.contact_id
AND t2.event_id != t1.event_id
WHERE t1.event_id = 'someid'
AND t2.event_id IS NULL;
假定在
(tickets.contact_id, tickets.event_id)
上具有正确的索引以提高性能。