Как написать запрос Sql, чтобы найти все участвующие строки в другой таблице?
Есть 3 таблицы: события, события клиентов и клиентов.
Написать запрос, который находит события, к которым имеют доступ все клиенты?
Внутреннее объединение не гарантирует участия всех строк в таблице, поэтому это не поможет:
select * from events e
inner join eventclients ec on e.id = ec.eventid
inner join clients c on etc.clientid = c.id
3 ответа
Вы можете использовать вложенный NOT EXISTS
чтобы проверить это:
SELECT e.*
FROM events e
WHERE NOT EXISTS(
SELECT 1 FROM client c
WHERE NOT EXISTS(
SELECT 1 FROM eventclients ec
WHERE ec.eventid = e.id AND c.id= ec.clientid
)
)
Вы также можете сделать
SELECT e.id, e.name
FROM events e LEFT JOIN eventclients ec
ON e.id = ec.eventid LEFT JOIN clients c
ON ec.clientid = c.id
GROUP BY e.id, e.name
HAVING COUNT(ec.clientid) =
(
SELECT COUNT(*) FROM clients
)
Вот демоверсия SQLFiddle
Предполагая, что вы имеете в виду, что событие имеет отношение многие-ко-многим с клиентом, а event_client - это мостовая таблица между ними, вам следует ответить на любой из множества других вопросов, касающихся SQL-соединения между отношениями "многие ко многим".