Проверьте значение не существует в столбце для группы записей в Mysql

0

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

  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

В приведенной выше таблице мне нужно сгруппировать чат и найти в этой группе имя должно существовать в приемнике, но не в отправителе вообще.

Здесь в группе а, например, ищу 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.
Теги:
select

3 ответа

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

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

Демо на SQL Fiddle

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню