Это достаточно распространенный вопрос о переполнении стека, поэтому я создаю для него новый тег sql-match-all
.Я вернусь и попытаюсь пометить некоторые из моих старых ответов, связанных с этой проблемой.
Исходя из вашего краткого описания, я предполагаю, что вы имеете в виду, что вы хотите вернуть группу строк, которые соответствуют всем наборузначения, например статьи с тегами (php, mysql, performance).Предикат IN()
не требует совпадения всех трех тегов, но в данной строке данных есть только один тег, а предложение WHERE может проверять только одну строку за раз.
Существует два популярных решения.для этой проблемы.Первый - подсчитать, сколько разных тегов в группе строк, и если он равен списку тегов, которые вы хотите сопоставить, то этот тест проходит успешно.
SELECT t.article
FROM Tags t
WHERE t.tag IN ('php', 'mysql', 'performance')
GROUP BY t.article
HAVING COUNT(DISTINCT tag) = 3;
Другое решениесамостоятельно присоединиться столько раз, сколько тегов вы ищете.Используя INNER JOIN, вы ограничиваете набор результатов только теми группами, которые совпадают.
SELECT t1.article
FROM Tags t1
INNER JOIN Tags t2 USING (article)
INNER JOIN Tags t3 USING (article)
WHERE (t1.tag, t2.tag, t3.tag) = ('php', 'mysql', 'performance');
Какое решение лучше, зависит от количества тегов, которые вы хотите сопоставить, насколько удобно построить этот запросв вашем приложении, а также конкретные оптимизации, в которых хорош ваш бренд RDBMS.Последнее решение обычно намного быстрее в MySQL, например, потому что MySQL стремится писать временные таблицы для запросов GROUP BY.Но вы должны проверить оба типа запросов в вашей базе данных, чтобы убедиться.