2011-12-30 131 views
0

好吧,我有兩個表:如何根據表#2中的結果篩選表1中的結果?

  • eventsidtitledescription
  • trip_eventsidevent_id(點eventsid。)

我需要從表中結果名爲events

SELECT * 
FROM `events` 

很簡單,對吧?

我需要實現的事情是,我需要從events選擇的結果,但不包括那些在trip_events行(如果eventsid!= trip_eventsevent_id的除外)。

這裏是例如:

events

  • id5
  • id6
  • id7
  • id8;

trip_events

  • event_id6
  • event_id8;

有了這個數據集,只能用ID事件56將返回。

如何做到這一點?

我想是這樣的:

SELECT * 
FROM `events` 
JOIN `trip_events` 
ON (`trip_events`.`event_id` = `events`.`id`) 
WHERE `trip_events`.`event_id` != `events`.`id` 

但沒有奏效。

回答

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

猜猜你爲什麼沒有得到任何結果!

+0

無論如何,我認爲加入解決方案會更好的性能的原因。 – 4ndrew 2011-12-30 09:12:46

+0

@ 4ndrew,是的,可能是,但只要性能不是問題(並且連接查詢實際上更快),我認爲它的意圖更具可讀性和明顯性。左連接用語是衆所周知的,但是你需要知道這個成語,並且在你能夠閱讀代碼之前確定使用了什麼成語。 – 2011-12-30 10:29:36

+0

@ 4ndrew:在測試數據之前,你無法知道什麼更快。據我所知,「不在」與「不存在」相比「左連接 - 零」具有相似的性能。 – 2011-12-30 10:44:48

1

嘗試以下查詢:

SELECT * FROM events WHERE ID不在(選擇trip_events事項標識)

2
select * 
from events e 
where not exists (
    select 1 from trip_events t 
    where t.event_id = e.id 
) 
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從性能角度提出的子查詢變種更好,這取決於你正在使用哪個SQL服務器(有些服務器在這種情況下執行更好的優化,這兩種變體提供相同的性能)。

+0

該查詢是正確的,但它不是內部聯接。這是一個(左)外連接。 – 2011-12-30 09:44:53

+0

@ypercube Ops,對不起,這是一個錯字。固定。 – 4ndrew 2011-12-30 09:54:30