2013-07-31 59 views
0

鑑於這種架構和數據的人:SQL:如何找到那些只參加一個活動

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,我期望只找到只參加一個事件的Bob,而不是參加兩個事件的Alice,而不是參加零的Charlie。

回答

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; 

假設性能上(tickets.contact_id, tickets.event_id)一個適當的指標..

+0

看起來像這樣一個會爲我們工作,謝謝! – jemminger

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) 
相關問題