Проверьте значение не существует в столбце для группы записей в Mysql - PullRequest
0 голосов
/ 28 мая 2018

У меня есть таблица, в которой хранятся данные, относящиеся к уникальному идентификатору, который объединяет несколько записей, чтобы сделать его частью группы.Я хочу проверить, существует ли в этой группе значение для столбца, но не для другого столбца.Я пытался с группой за пунктом, где пункт, но я не получаю ожидаемые записи.Будем благодарны за любую помощь.

  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 голосов
/ 28 мая 2018

Я думаю, вы ищете что-то вроде этого:

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

Это для вашего первого состояния.Остальные похожи.

0 голосов
/ 28 мая 2018
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);

Демонстрация по SQL Fiddle

0 голосов
/ 28 мая 2018

Один простой подход использует условное агрегирование для утверждения ваших условий:

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, иначе вам придется окружатьимя этого столбца с обратными галочками при каждом его использовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...