BonBonSlick
@BonBonSlick
Vanilla Full Stack Web Architector

Выбрать посты по наибольшему количеству одинаковых тегов?

Post <-> Tag manyToMany. А значит есть Pivot table в которой лежат post_id + tag_id.

В рекомендациях вывести посты которые имеют наибольшее количество одинаковых тегов с текущим.

Вот как я понимаю

SELECT *
FROM posts 
INNER JOIN tags
WHERE posts.tags IN [1,5,8,12,56,4,44] // take posts which hase most alike tags
COUNT(posts.tags.id)
ORDER BY posts.tags.id


Это грубый, черновой вариант, в проекте doctrine 2.6, symfony 4.1, pgsql 9.6.

У меня не выходит, потому что IN берет все посты где хотя бы 1 есть такой тег, а ндо минимум 55% одинаковых, не пойму пока как это сделать . Скорее всего надо еще групировать как-то и делать подзапрос, но тогда O(n) будет долгим так как джойнов больше чем в примере и обьем выборки в разы крупнее. Возможно будет лучше разбить на несколько запросов.
  • Вопрос задан
  • 58 просмотров
Решения вопроса 1
BonBonSlick
@BonBonSlick Автор вопроса
Vanilla Full Stack Web Architector
SELECT p.uuid, count(tg.tag_uuid) as TagCount
FROM episode_details p
         INNER JOIN episodes_tags tg
                    ON p.uuid = tg.episode_uuid
         INNER JOIN anime_tag t
                    ON tg.tag_uuid = t.uuid
WHERE t.uuid in (1, 54, 32)
GROUP BY p.uuid
ORDER BY TagCount DESC
limit 3

https://stackoverflow.com/questions/3876251/need-h...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
BojackHorseman
@BojackHorseman
...в творческом отпуске...
та не. можно одним)) нужно правильно заджойнить tags на tags и посчитать количество совпадающих тегов

SELECT
 t2.post_id, COUNT(*)
FROM <posttags_table> t1
JOIN  <posttags_table> t2 ON t2.post_id != t1.post_id AND t2.tag_id = t1.tag_id
WHERE t1.post_id = ?
GROUP BY t2.post_id


с дублями еще прикинуть, чтобы избежать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы