Не очень понятно, что вы хотите.
Я буду называть таблицу t1 word
, вызывать таблицу t3 phrase
и вызывать таблицу t2 word is in phrase
.
Тогда, я думаю, вы хотите найти все word.ids, которые находятся в одной фразе с определенным набором word.ids.Это правильно?
SELECT DISTINCT t1.id
FROM t1
JOIN t2
ON t1.id = t2.t1key
JOIN t2 copyt2
ON copyt2.t3key = t2.t3key
WHERE copyt2.t1key IN
(6,4) --what you want to check here
ИСПРАВЛЕНИЕ
Читая комментарий Джо и перечитывая детали вопроса, я думаю, вы хотите найти все слова, которые появляютсяв той же фразе со ВСЕМИ словами в указанном вами списке.
Это похоже на проблему реляционного деления:
SELECT DISTINCT t2a.t1key
FROM t2 AS t2a
WHERE NOT EXISTS
( SELECT *
FROM t2 AS t2b
WHERE t2b.t1key IN (6,4)
AND NOT EXISTS
( SELECT *
FROM t2 AS t2c
WHERE t2a.t3key = t2c.t3key
AND t2c.t1key = t2b.t1key
)
)
2-е решение:
SELECT a.t1key
FROM t2 AS a
JOIN t2 as b
ON a.t3key = b.t3key
WHERE b.t1key IN (6,4) --list you want to check
GROUP BY a.t1key, a.t3key
HAVING COUNT(*) = 2 --size of list
;
3-е решение:
SELECT DISTINCT t1key
FROM t2
WHERE t3key IN
( SELECT t3key
FROM t2
WHERE t1key IN (6,4)
GROUP BY t3key
HAVING COUNT(*) = 2
)
;
Примечание: Первое (с NON EXISTS
) решение сильно отличается от двух других:
Если вы попробуете его со списком, его членыне появляются в таблице t2, скажем, (2)
или (2,7)
, это покажет ВСЕ ключи t1 от t2.
2-е и 3-е решения вообще не будут показывать никаких ключей.