В настоящее время я работаю над системой, позволяющей помечать документы ключевыми словами и иметь таблицу в форме:
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?
Мне нравится подходить к этим запросам, используя агрегацию и having
пункт:
SELECT documentID
FROM KeywordsToDocuments
WHERE KeywordID IN (keyword1, keyword2)
GROUP BY documentID
HAVING COUNT(*) = 2;
Это стандартный SQL и должен работать в любой базе данных. Кроме того, путем изменения HAVING
предложение, у вас есть большая гибкость в логике комбинаций ключевых слов, которые вы ищете.
Других решений пока нет …