У меня есть три таблицы: posts
, tags
и postTags
. Как вы, наверное, догадались, posts
содержит информацию о сообщениях в блогах, tags
содержит информацию о тех тегах, которые используются в системе, а postTags
содержит отношения между posts
и tags
.
Теперь давайте предположим, что я знаю tagID
каждого тега, который я ищу, а также те, которые я не знаю, что было бы подходящим, что было бы подходящим запросом для получения всех posts
, которые соответствуют критериям наличия всех tagID
s I указать в одном списке и не иметь ничего из того, что я указываю в другом?
Один из способов, которым я могу работать, это:
SELECT
`posts`.*,
CONCAT(',', GROUP_CONCAT(`postTags`.`tagID`), ',') AS `pTags`
FROM
`posts`
INNER JOIN
`postTags`
ON
`postTags`.`postID` = `posts`.`postID`
GROUP BY
`posts`.`postID`
HAVING
`pTags` LIKE '%,2,%'
AND
`pTags` LIKE '%,3,%'
AND
`pTags` NOT LIKE '%,5,%'
Этот запрос выберет все сообщения, которые были помечены tagID 2 и 3, а не помечены tagID 5. Но это кажется потенциально довольно медленным, особенно когда данные фильтруются большим количеством тегов.
ИЗМЕНИТЬ