Как получить записи, где нет заданного типа после group by

Рейтинг: 0Ответов: 1Опубликовано: 18.01.2023

Есть 2 таблицы. Клиентов и их действий. Надо получить тех клиентов, у которых нет конкретного действия. Таблицы выглядят вот так, исходные данные:

clients:

empId   name
1       Clark
2       Dave
3       Ava
4       Avaaad

actions:

empId   cliId   typeAct
1       1       1
2       1       2
3       2       2
4       3       3
5       1       3

Можете посмотреть в онлайн mysql

Сделал следующий запрос. Он выбирает клиентов и их действия. Выбор клиента без действий не составляет труда. Можно просто дописать WHERE actions.typeAct IS NULL, а вот как выбрать клиентов, у которых нет конкретного действия? Каким-то подзапросом или это уже через PHP делать?

SELECT name, typeAct FROM clients
left join actions on actions.cliId=clients.empId
group by clients.name, actions.typeAct;

Вывод:

name    typeAct
Clark   3
Clark   2
Clark   1
Dave    2
Ava     3
Avaaad  NULL

Ожидания, например для тех, у кого нет действия 2:

name    typeAct
Ava     3
Avaaad  NULL

Ответы

▲ 1Принят
    SELECT c.name, a.typeAct 
    FROM clients c
    LEFT JOIN actions a on a.cliId=c.empId AND a.typeAct != 2
    WHERE NOT EXISTS(SELECT 1 FROM actions ac WHERE ac.cliId = c.empId AND ac.typeAct = 2)
    GROUP BY c.name, a.typeAct;

Объяснение:

Грубо говоря, проверяем все actions с typeAct = 2 на существование с конкретным empId. Если находим хотя бы одно, то не учитываем в выборке