我有两张桌子:
USERS(ID,NAME)
USERS_STATUSES(ID,USER_ID,STATUS)
并且用户可能拥有许多ex的状态。用户x具有(A,C)状态
我需要让所有USERS用户拥有状态(A,B)并且没有状态(C,D)同时形成USERS_STATUSES表
因此不得返回示例中的用户。
请问返回此结果的查询是什么?
谢谢!
答案 0 :(得分:2)
您可以使用group by
和having
子句执行此操作:
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);