首页 > 解决方案 > sql根据类别匹配频率选择相似电影

问题描述

嗨,我希望你们是好人
,我想根据电影类别选择类似的电影,
所以我的数据库中有这个表

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 是用户当前观看的电影的 id

预期结果是所有电影数据,并且类别匹配频率
例如假设当前观看的电影具有类别:动作、奇幻、戏剧,
因此具有相同类别的电影 (100% :具有相同的类别)将首先排列,然后是电影(66.66%:仅匹配 2 个类别)等等....

注意:我可以在 php 中完成,但我想用 sql 完成

标签: mysqlsql

解决方案


首先你需要知道当前的电影类别

 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

推荐阅读