Чтобы использовать SQL для такого рода приложений, вам нужно найти соответствующие теги, а затем подсчитать их.
Например, если вы хотите, чтобы значения идентификаторов постов были помечены как July
и Beach
, вы можете сделать это.
SELECT pt.post_id
FROM posts_tags pt
JOIN tags t ON t.id = pt.tag_id
WHERE t.title IN ('July','Beach')
GROUP BY pt.post_id
HAVING COUNT(*) = 2
В предложении HAVING
требуются оба тега, а в предложении IN ()
упоминаются заголовки тегов.
Если вы хотите найти значения post_id и сначала показать те, у которых есть самые подходящие теги, вы можете попробовать это.
SELECT pt.post_id, COUNT(*) score
FROM posts_tags pt
JOIN tags t ON t.id = pt.tag_id
WHERE t.title IN ('June', 'July', 'August', 'Beach')
GROUP BY pt.post_id
ORDER BY COUNT(*) DESC
Затем, чтобы получить фактические сообщения, вы присоединяете все это к своей таблице сообщений, и ваш результат выглядит следующим образом.
SELECT match.score, posts.column, posts.column, posts.colun
FROM posts
JOIN (
SELECT pt.post_id, COUNT(*) score
FROM posts_tags pt
JOIN tags t ON t.id = pt.tag_id
WHERE t.title IN ('June', 'July', 'August', 'Beach')
GROUP BY pt.post_id
) match ON posts.id = match.post_id
ORDER BY match.score DESC
Видите хитрость с этим? Вам нужно посчитать количество совпадений с тегами, когда вы пытаетесь сопоставить несколько.