как получить похожие объекты на основе тегов - PullRequest
3 голосов
/ 21 ноября 2010

У меня есть три таблицы, подобные этим:

  • фильм: идентификатор, имя

  • тег: идентификатор, имя, значение

  • с тегами: id, фильм (FK), тег (FK)

Таким образом, у каждого фильма есть свой набор тегов. Что мне нужно, это найти похожие фильмы на основе набора тегов. Я хочу получить, скажем, 10 фильмов, отсортированных по количеству совпадающих тегов.

Если я создаю представление, как показано ниже, MySQL исчезает. Есть более 30 тыс. Записей в таблицах тегов и тегов.

create view relatedtags as 

select
    entityLeft.id as id,
    entityRight.id as rightId,
    count(rightTagged.id) as matches

from
    entity as entityLeft join tagged as leftTagged on leftTagged.entity = entityLeft.id, 
    entity as entityRight join tagged as rightTagged on rightTagged.entity = entityRight.id

where leftTagged.tag = rightTagged.tag
and entityLeft.id != entityRight.id
group by entityLeft.id, entityRight.id

1 Ответ

7 голосов
/ 21 ноября 2010

Будет возвращен список всех фильмов, в которых есть хотя бы 1 тег с указанным <current_movie_id>, упорядоченный по убыванию общего количества тегов

SELECT movie.*, count(DISTINCT similar.tag) as shared_tags FROM movie INNER JOIN 
    ( tagged AS this_movie INNER JOIN tagged AS similar USING (tag) )
    ON similar.movie = movie.id
WHERE this_movie.movie=<current_movie_id>
AND   movie.id != this_movie.movie
GROUP BY movie.id
ORDER BY shared_tags DESC

надеюсь, что это даст вам возможность поработать с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...