2013-11-01 53 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中使用。 –

相关问题