mysql - 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 完成
解决方案
首先你需要知道当前的电影类别
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
推荐阅读
- javascript - 使用 css 更改画布的宽度
- ocaml - 如何使 Ocaml 多态变体私有
- excel - 如何在outlook中检查附加的excel文件的属性?
- mongodb - 在 Mongo 中存储每年更新的数据
- html - 导航栏布局问题(Wordpress)
- google-cloud-platform - GCP Dataflow 未在 UI 中获取步骤日志。使用 python SDK
- asp.net-core - .net core Custom oauth2 login 和 Google login api 一起出现错误
- html - div-content 可见thought div-height = 0
- mysql - 如何编写我的 sql 查询来拆分列?
- c++ - 为什么从基类继承的成员函数未定义?