2013-11-01 51 views
0

爲了簡單起見,假設你有兩個表...SQL查詢來選擇從一個表,其中不是沒有在其他表或該表中與特定值

users: 
    user_id 
    name 
    age 

clothing: 
    user_id 
    type 
    color 

,你會如何選擇所有用戶誰是21歲,或者根本沒有任何襯衫,或者有襯衫,但沒有任何紅衫?我嘗試迄今還看像...

SELECT users.user_id 
FROM users LEFT JOIN clothing 
ON users.user_id = clothing.user_id 
AND clothing.type = shirt 
AND clothing.color != red 
WHERE users.age = 21; 

我知道如何做到這一點查詢,如果我只是想選擇的用戶不具有在clothing表(WHERE clothing.user_id IS NULL)項的條目,但我似乎無法將這種邏輯延伸到這個稍微複雜的情況。

回答

2
SELECT users.user_id FROM users 
WHERE users.age = 21 
AND users.user_id NOT IN 
    (SELECT user_id FROM clothing WHERE user_id IS NOT NULL AND type = 'shirt' AND color = 'red') 

它實際上是簡單識別所有誰擁有紅色襯衫的人,然後說,話雖如此,我認爲你實際上需要將clothing分成兩個表格:一個表格只列出服裝項目,另一個表格鏈接user_idclothing_id

+0

添加了「NOT NULL」檢查,因爲這似乎可能在您的表結構中。這是你需要將它分成兩張桌子的另一個很好的理由 - 一件衣服的存在與是否有人穿着無關。 –

+0

如果您將NOT IN重寫爲NOT EXISTS,您可以避免檢查user_id IS NOT NULL。除此之外,我同意你對病情的簡化。我得出的結論有點不同:一個人不能有紅襯衫或襯衫。但是,如果他們沒有任何襯衫,也包括一件紅色襯衫,那麼就足以檢查是否缺少一件紅色襯衫來掩飾這兩種情況。 –

0

如何是這樣的:「給我所有的人該組中的」

SELECT users.user_id 
FROM users u1 LEFT OUTER JOIN clothing c # outer join makes sure you get a user back. 
ON users.user_id = c.user_id 
where c.type = shirt AND 
(count(select * from users u2 where u1.user_id =- u2.user_id LEFT INNER JOIN clothing c2 on u2.user_id = c2.user_id) > 0 OR 
c.color != red) AND 
users.age = 21; 
+0

有一個錯字'和哪裏' –

+1

更正了錯字。 –

+0

如果沒有深入研究這些查詢,它們都不會因爲WHERE子句中的COUNT()而編譯。集合函數不能在WHERE中使用。 –

相關問題