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

时间:2018-05-28 13:28:20

标签: mysql sql select

我有一个表,用于存储与唯一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.

3 个答案:

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

Demo on SQL Fiddle