检查mysql中记录组的列中不存在值

ny6fqffe  于 2021-06-23  发布在  Mysql
关注(0)|答案(3)|浏览(313)

我有一个表,它存储的数据分别对应于一个唯一的id,该id聚集了多个记录,使其成为组的一部分。我想检查该组中是否存在某列的值,而不是其他列的值。我尝试了GROUPBY子句,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

在上表中,我需要对聊天进行分组,并在该组中找到一个名称应该存在于receiver中,而不是sender中。
例如,在组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.
fsi0uk1n

fsi0uk1n1#

一种简单的方法是使用条件聚合来Assert条件:

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 ,否则每次使用该列名时都必须用反勾号将其括起来。

kmynzznz

kmynzznz2#

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);

sqlfiddle演示

6xfqseft

6xfqseft3#

我想你在找这样的东西:

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'
                 );

这是你的第一个条件。其余的都差不多。

相关问题