我有一个表,用于存储与唯一ID相对应的数据,该ID包含多个记录以使其成为组的一部分。 我想检查该组中是否存在列的值,而不是其他列中的值。 我尝试使用group by子句where子句,但我没有得到预期的记录。任何帮助将不胜感激。
id Group receiver sender sender_role
1 a Val1 Val2 Guest
2 a Val1 Val2 Guest
3 b Val3 Val4 CC
4 b Val4 Val3 Guest
5 b Val4 Val3 Guest
6 c Val5 Val6 Guest
在上表中,我需要对聊天进行分组,并在该群组中找到一个名称应该存在于收件人中,但根本不存在于发件人中。
此处在 a 组中,例如正在寻找 Val1 ,因此它符合接收者的条件,而不是发件人的条件。
1 a Val1 Val2 Guest
2 a Val1 Val2 Guest
此处在 b 组中,例如查找Val3,因此它与条件不匹配,因为接收者和发件人都存在Val3。
3 b Val3 Val4 CC
4 b Val4 Val3 Guest
5 b Val4 Val3 Guest
此处在 c 组中,例如查找Val5,因此它与条件匹配,因为Val5存在于接收方而不是发送方。
6 c Val5 Val6 Guest.
答案 0 :(得分:0)
一种简单的方法是使用条件聚合来断言你的条件:
SELECT `Group`
FROM yourTable
GROUP BY `Group`
HAVING
SUM(CASE WHEN receiver = 'Val1' THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN sender = 'Val1' THEN 1 ELSE 0 END) = 0;
顺便说一下,不为您的列Group
命名,否则每次使用时都必须用反引号包围该列名。
答案 1 :(得分:0)
我认为你正在寻找这样的东西:
select t.*
from t
where exists (select 1
from t t2
where t2.group = t.group and t2.receiver = 'Val1'
) and
not exists (select 1
from t t2
where t2.group = t.group and t2.sender = 'Val1'
);
这是你的第一个条件。其余的相似。
答案 2 :(得分:0)
select a.*
from your_table a
where not exists
(select null from your_table b where
a.`group`=b.group and a.receiver=b.sender);