это моя проблема sql - есть 3 таблицы:
<b>Names Lists ListHasNames</b>
Id Name Id Desc ListsId NamesId
=-------- ------------ ----------------
1 Paul 1 Football 1 1
2 Joe 2 Basketball 1 2
3 Jenny 3 Ping Pong 2 1
4 Tina 4 Breakfast Club 2 3
5 Midnight Club 3 2
3 3
4 1
4 2
4 3
5 1
5 2
5 3
5 4
Это означает, что Пол (Id = 1) и Джо (Id = 2) в футбольной команде (Lists.Id = 1), Пол и Дженни в баскетбольной команде и т. Д ...
Теперь мне нужен оператор SQL, который возвращает Lists.Id определенной комбинации имен:
В каких списках Пол, Джо и Дженни единственные члены этого списка? Отвечать только Lists.Id = 4 (Клуб для завтраков) - но не 5 (Клуб для полуночи), потому что Тина тоже в этом списке.
Я пробовал это с ВНУТРЕННИМИ СОЕДИНЕНИЯМИ И ПОДПИСКАМИ:
SELECT Q1.Lists_id FROM
(
SELECT Lists_Id FROM
names as T1,
listhasnames as T2
WHERE
(T1.Name='Paul') and
(T1.Id=T2.Names_ID) and
( (
SELECT count(*) FROM
listhasnames as Z1
where (Z1.lists_id = T2.lists_Id)
) = 3)
) AS Q1
INNER JOIN (
SELECT Lists_Id FROM
names as T1,
listhasnames as T2
WHERE
(T1.Name='Joe') and
(T1.Id=T2.Names_ID) and
(
(SELECT count(*) FROM
listhasnames as Z1
WHERE (Z1.Lists_id = T2.lists_id)
) = 3)
) AS Q2
ON (Q1.Lists_id=Q2.Lists_id)
INNER JOIN (
SELECT Lists_Id FROM
names as T1,
listhasnames as T2
WHERE
(T1.Name='Jenny') and
(T1.Id=T2.Names_ID) and
(
(SELECT count(*) FROM
listhasnames as Z1
WHERE (Z1.Lists_id = T2.lists_id)
) = 3)
) AS Q3
ON (Q1.Lists_id=Q3.Lists_id)
Выглядит немного сложно, а? Как это оптимизировать?
Мне нужны только те Lists.Id, в которых есть конкретные имена (и только эти имена и никто другой). Может быть, с SELECT IN?
С уважением,
Dennis