查找具有状态(A,B)且同时没有状态(C,D)的用户

时间:2015-06-16 10:36:12

标签: mysql sql database

我有两张桌子:

USERS(ID,NAME)
USERS_STATUSES(ID,USER_ID,STATUS)

并且用户可能拥有许多ex的状态。用户x具有(A,C)状态

我需要让所有USERS用户拥有状态(A,B)并且没有状态(C,D)同时形成USERS_STATUSES表

因此不得返回示例中的用户。

请问返回此结果的查询是什么?

谢谢!

4 个答案:

答案 0 :(得分:2)

您可以使用group byhaving子句执行此操作:

select user_id
from users_statuses us
group by user_id
having sum(status = 'A') > 1 and
       sum(status = 'B') > 1 and
       sum(status = 'C') = 0 and
       sum(status = 'D') = 0;

你的问题有点模糊。我不确定你是否想要同时排除两个 C和D,或者只是其中一个。所以,你可能想要:

having sum(status = 'A') > 1 and
       sum(status = 'B') > 1 and
       (sum(status = 'C') = 0 or
        sum(status = 'D') = 0
       )

答案 1 :(得分:1)

这是MySQL特定的,因为我按ID分组并从用户表中选择所有列,但在此上下文中它是正确的:

SELECT u.*
FROM
  users u INNER JOIN users_statuses s
  ON u.id=s.user_id
GROUP BY
  u.id
HAVING
  COUNT(DISTINCT CASE WHEN s.status IN ('A','B') THEN s.status END)=2
  AND
  SUM(s.status IN ('C','D'))=0

答案 2 :(得分:0)

这适用于状态A或B而不是C和D

BEGIN

如果您需要A和B,而不是C和D,请替换为以下

select id, name
from users 
where id in (select id from users_statuses where statuses in ('A', 'B'))
and id not in (select id from users_statuses where statuses in ('C', 'D'))

答案 3 :(得分:-1)

可能此查询会对您有所帮助。它工作正常整数,我不知道字符串

 select * from table_name where status in(1, 2) AND status not in(3, 4);