Mysql SQL查询,从一个表中进行选择,该表不在另一个表中或在该表中具有特定值

Mysql SQL查询,从一个表中进行选择,该表不在另一个表中或在该表中具有特定值,mysql,sql,Mysql,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

为了简单起见,假设您有两个表

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;

如果我只想选择用户在
服装
表中没有条目的条目(
其中,toughts.user\u id为NULL
),我知道如何执行此查询,但我似乎无法将该逻辑扩展到稍微复杂的情况。

类似于:

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;

事实上,更简单的方法是识别所有穿红衫的人,然后说,“把不属于那一组的人都给我。”也就是说,我认为你实际上需要将
服装
分为两张表:一张表只列出服装项目,还有一个链接
user\u id
countain\u id

的是一个打字错误
,而where
如果不深入研究这些查询,它们都不会编译,因为where子句中有COUNT()。聚合函数无法在WHERE中使用。已删除出现该问题的第一个查询。左二,子选择中只有计数。添加了一个
notnull
检查,因为这在您的表结构中似乎是可能的。这也是您需要将其分为两个表的另一个很好的原因-一件衣服的存在与是否有人穿着它无关。您可以避免
用户id不为NULL
检查是否将not IN重写为not EXISTS。除此之外,我同意你对条件的简化。我得出的结论也有点不同:一个人不能穿红衬衫或任何衬衫。但如果他们没有任何衬衫,那也包括一件红色衬衫,因此检查两种情况下是否都没有红色衬衫就足够了。
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')