鉴于此架构和数据:
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。
答案 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)