Один стол INTERSECT альтернатива

В настоящее время я работаю над системой, позволяющей помечать документы ключевыми словами и иметь таблицу в форме:

CREATE TABLE `KeywordsToDocuments` (
`keywordID` int NOT NULL,
`documentID` int NOT NULL);

Каждый документ может быть связан со многими ключевыми словами, а каждое ключевое слово — со многими документами. К сожалению простой AND оператор не достигает того, что мне нужно, поскольку ни одна строка не будет удовлетворять нескольким значениям KeywordID, вместо этого публикация связана с несколькими ключевыми словами путем включения ее идентификатора в несколько строк с разными идентификаторами ключевых слов.

Я пытаюсь написать запрос, который даст мне список документов, которые помечены любым произвольным количеством ключевых слов. Моя первая попытка была следующей, которая использует INTERSECT заявление:

SELECT documentID FROM KeywordsToDocuments WHERE KeywordID=keyword1
INTERSECT
SELECT documentID FROM KeywordsToDocuments WHERE KeywordID=keyword2
...

Где ... может быть произвольным количеством похожих утверждений для дальнейших ключевых слов. Этот запрос создается PHP-скриптом динамически.

Здесь я пытаюсь найти все документы, которые связаны с каждым ключевым словом в отдельности, а затем из этих наборов результатов найти пересечение, которое будет представлять собой документы, связанные со всеми запрошенными ключевыми словами.

Однако я только что узнал, что MySQL не поддерживает INTERSECT заявление. Я искал альтернативы, но все ресурсы, которые я нашел на замену INTERSECT сосредоточены на том, чтобы использовать его для объединения результатов из двух разных таблиц. Я не вижу способа в этом случае преобразовать в другое утверждение, такое как INNER JOIN,

Как сделать такой запрос без использования INTERSECT заявление, чтобы разрешить совместимость с MySQL?

0

Решение

Мне нравится подходить к этим запросам, используя агрегацию и having пункт:

SELECT documentID
FROM KeywordsToDocuments
WHERE KeywordID IN (keyword1, keyword2)
GROUP BY documentID
HAVING COUNT(*) = 2;

Это стандартный SQL и должен работать в любой базе данных. Кроме того, путем изменения HAVING предложение, у вас есть большая гибкость в логике комбинаций ключевых слов, которые вы ищете.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]