SQL:如何找到只参加过一个活动的人

时间:2013-07-31 18:02:58

标签: mysql sql join

鉴于此架构和数据:

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

如何找到参加过一个活动的人?我希望只能找到只参加过一次活动的Bob,而不是参加过两次活动的Alice而不是参加过零活动的Charlie。

可能会有数百个联系人和活动,我想找到那些之前没有参加任何活动的特定活动的联系人。

我在这个上画了一个空白。

编辑:让我澄清一下,

如何找到参加过一次特定活动的人?对于活动2,我希望只找到只参加过一个活动的Bob,而不是参加过两个活动的Alice而不是参加过零活动的Charlie。

2 个答案:

答案 0 :(得分:1)

@ yang的答案适用于只参加过一次非特定事件的用户,但是,如果你想找到一个参加特定的人作为他们的第一个也是唯一一个,那么如果{{1 }}不能是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; 的适当指数用于表现。

答案 1 :(得分:0)

此版本可能也可以执行,具体取决于您的优化程序,并且意图是明确的(所有参与特定事件的联系人,但不是任何其他事件):

SELECT *
FROM contacts c
WHERE EXISTS (SELECT * FROM tickets WHERE contact_id = c.id AND event_id = 2)
AND NOT EXISTS (SELECT * FROM tickets WHERE contact_id = c.id AND event_id <> 2)