2011-06-13 140 views
2

假設我們有一個表Users,它只有一列UserId這是主鍵。如何編寫這個MySQL查詢?

我們有第二張表Events,它有三列EventId,UserIdStatus。 A StatusBOOL NOT NULLUserId已編入索引但不是唯一的。

StatusUsers.UserId上有外鍵約束UserId

現在我想要查詢所有UserId s,其中Events中沒有行,因此Event.Status = TRUE。有沒有辦法做到這一點JOIN? (一個語句只首選)

例如:

Users 
-------- 
1 
2 
3 

Events 
-------- 
EventId UserId Status 
1   1  FALSE 
2   1  TRUE 
3   2  FALSE 
4   2  FALSE 

然後我在尋找查詢應該返回:

UserId 
------- 
2 
3 

謝謝!

回答

3

出人意料的是,子查詢是這樣做在MySQL一個reasonably efficient方式。所以:

SELECT UserId 
FROM Users 
WHERE UserId NOT IN (
     SELECT DISTINCT UserID 
     FROM Events 
     WHERE Status = TRUE 
     ) 

請注意,我使用DISTINCT存在,這可能不是引用的文章一個完美的結合。請注意,對於DISTINCT,或者將它關閉(但我不知道這是否會導致有問題的臨時數據集,或者MySQL是否聰明)。

或者你也可以做LEFT JOIN/IS NULL版本,它不具備DISTINCT問題:

SELECT Users.UserId 
FROM  Users 
LEFT JOIN Events 
      ON Events.UserId = Users.UserId AND Events.Status = TRUE 
WHERE  Events.UserId IS NULL 

見上面的討論,鏈接,但MySQL的主要提供在這兩種情況下相同的性能(而使用NOT EXISTS而不是NOT IN將效率顯着較低)。

我會嘗試兩個(或全部三個,如果您嘗試使用第一個和不使用DISTINCT)並查看您的真實數據的效果最好。

+0

左連接似乎是一個更好的選擇。第一個選項使用可影響性能的DISTINCT。 http://stackoverflow.com/questions/521055/in-sql-how-does-using-distinct-affect-performance – isobar 2011-06-13 04:47:51

+0

@isobar:好的一點,引用的文章沒有使用DISTINCT,並且性能特徵將會不同在那裏。 – 2011-06-13 05:02:10

+0

謝謝!你們真棒! =)實際上,幸運的是,在實際場景中,每個UserId只有一個TRUE。 – javic 2011-06-13 05:06:31

2

事情是這樣的:

select UserId 
from Users 
where UserId not in (
    select UserId 
    from Events 
    where Status = TRUE) 

隨着左連接:

select UserId 
from Users usr 
    left join Events evt on 
     evt.UserId = usr.UserId and evt.Status = TRUE 
where evt.UserId is null 
+0

嗯...我不能打勾兩個答案?那麼你們倆都是對的:) – javic 2011-06-13 05:11:39

+0

@javic - 我是第一個:)。 – 2011-06-13 05:49:14

+0

@ T.J。 Crowder - 夠公平:)。讓答案是你的:)。我也可以提供參考資料。我相信這個問題沒有被問到。只是回答這個問題。 – 2011-06-13 06:01:40