Ниже приведена структура моих таблиц:
posts table:
---------------------
|id|title|body|etc..|
---------------------
tags table:
---------------
|id|name|etc..|
---------------
post_tag table (the pivot table):
-------------------
|id|post_id|tag_id|
-------------------
Как видите, многие сообщения могут иметь много тегов и наоборот. То, что я спрашиваю, это как сделать запрос к связанным сообщениям, основываясь на том, сколько у них общих тегов? Например, если у меня есть несколько постов, таких как:
- Это пост с тегами: #sql, #nosql, # database
- Это пост с тегами: #sql, # nosql
- Это сообщение три с тегами: # database
- Это сообщение четыре с тегами: # stackoverflow
Как запросить сообщения, связанные с(с общими тегами) с постом 1 и упорядочить результат по количеству общих тегов? Я пробовал следующий запрос:
SELECT p.*
FROM posts p
INNER JOIN post_tag pt ON p.id = pt.post_id
INNER JOIN tags t on pt.tag_id = t.id
WHERE t.id IN (
SELECT t.id
FROM tags t
INNER JOIN post_tag pt ON t.id = pt.tag_id
INNER JOIN posts p ON pt.post_id = p.id
WHERE p.id = ?
) AND p.id != ? LIMIT 8
Это сработало, но будет возвращать дубликаты, если сообщения имеют более одного тега. Кроме того, я не знаю, как упорядочить результат по количеству общих тегов. Вот и все, и заранее спасибо!