sql выбрать похожие фильмы на основе частоты совпадения категорий - PullRequest
0 голосов
/ 17 декабря 2018

Привет, я надеюсь, что вы хорошие парни
Я хочу выбрать похожие фильмы на основе категорий фильмов
, поэтому у меня есть эти таблицы в моей базе данных

table movies :id,title,......,date
table movie_categories : id,id_movie,id_category
table categories : id,category

, где категорияпросто: боевик, драма, .....
Я маленький нуб в SQL-запросах, так что я надеюсь, что кто-то может мне помочь
, и я попробовал это до сих пор

SELECT m.*,COUNT(mc.*) AS cat_frequency 
FROM movies m,movie_categories mc 
WHERE mc.id_category IN (SELECT c.id_category FROM movie_categories c WHERE id_movie = 1)
ORDER BY cat_frequency 

где 1 - идентификатор фильма, который пользователь просматривает в данный момент

ожидаемый результат - это все данные фильма и с частотой совпадения категорий
для примера, скажем, у текущего просматриваемого фильма есть категории: боевик, фантастика, драма
, поэтому сначала по порядку будут смотреть фильмы с одинаковыми категориями (100%: с одинаковыми категориями), а затем фильмы (66,66%: сопоставлены только 2 категории).и так далее ...

примечание: я могу сделать это в php, но я хочу сделать это с sql

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Сначала вам нужно узнать текущие категории фильмов

 SELECT c.id_category 
 FROM movie_categories c 
 WHERE id_movie = 1

Затем вам нужно проверить, сколько категорий соответствует каждому фильму

SELECT m.id, COUNT(*) AS cat_frequency 
FROM movies m
JOIN movie_categories mc ON m.id = mc.id_movie   
WHERE mc.id_category IN ( SELECT c.id_category 
                          FROM movie_categories c 
                          WHERE c.id_movie = 1 )
GROUP BY m.id

Теперь у вас есть соответствующее число кошек, выобъединить оба, чтобы отсортировать по этому атрибуту

SELECT m.*
FROM movies m
JOIN (
        SELECT m.id, COUNT(*) AS cat_frequency 
        FROM movies m
        JOIN movie_categories mc ON m.id = mc.id_movie    
        WHERE mc.id_category IN ( SELECT c.id_category 
                                  FROM movie_categories c 
                                  WHERE c.id_movie = 1 )
        GROUP BY m.id
     ) f
  ON m.id = f.movie_id
WHERE m.id <> 1 -- you probably dont want show the current movie.
ORDER BY f.cat_frequency DESC
0 голосов
/ 17 декабря 2018

Полагаю, вам нужен такой запрос:

SELECT m.title, c.id_category,COUNT(*) AS cat_frequency 
  FROM movies m
  JOIN movie_categories mc ON m.id = mc.id_movie
  JOIN categories c ON c.id_category = mc.id_category
 GROUP BY c.id_category
 ORDER BY cat_frequency DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...