首先,给出数据库设计:
[Table_Rel_Tag] #记录电影与其标签的关系表
movie_id,
tag_id
[Table_Tag]
tag_id,
tag_name
现在我有一部电影,《功夫》(movie_id = 1)比如,它的tag就是:搞笑(Tag_id=1),动作(tag_id=2),在数据库内是这样表示的
[Table_Rel_Tag]
rid = 1, movie_id = 1, tag_id = 1
rid = 2, movie_id = 1, tag_id = 2
..
...
类似以上,我现在要推荐一部同类型的,譬如《喜剧之王2》(tag_id = 1, 2),如果有两个以上相同的 tag ,则可认为是同类型的,结果由关键字的多少排序……
不知道表述清楚没,希望有朋友能帮帮忙~~
首先,给出数据库设计:
[Table_Rel_Tag] #记录电影与其标签的关系表
movie_id,
tag_id
[Table_Tag]
tag_id,
tag_name
现在我有一部电影,《功夫》(movie_id = 1)比如,它的tag就是:搞笑(Tag_id=1),动作(tag_id=2),在数据库内是这样表示的
[Table_Rel_Tag]
rid = 1, movie_id = 1, tag_id = 1
rid = 2, movie_id = 1, tag_id = 2
..
...
类似以上,我现在要推荐一部同类型的,譬如《喜剧之王2》(tag_id = 1, 2),如果有两个以上相同的 tag ,则可认为是同类型的,结果由关键字的多少排序……
不知道表述清楚没,希望有朋友能帮帮忙~~
select count(*) as s,movie_id
from Table_Rel_Tag
where tag_id in ("譬如《喜剧之王2》(tag_id = 1, 2)")
group by movie_id
having s>2
order by s desc;
思路:
1. 先查出所有相关tag_id的记录。
2. 将这些记录group by 并统计每个movie_id出现的次数s(出现N次则表示有N个相同的tag_id)
3. 根据s进行排序
直接看示例吧 http://sqlfiddle.com/#!8/5d7db/10
假设有movie表,列为 movie_id, movie_name
<code>select movie_name, a.movie_id, count(1) as same_tag_count from rel_tag a left outer join movie b on a.movie_id = b.movie_id where tag_id in ( select tag_id from rel_tag where movie_id = 1 ) and a.movie_id != 1 group by a.movie_id having same_tag_count >= 2 order by same_tag_count desc; </code>
我的思路是这样的
可以获取到当前电影的tag吧,标记为tag1,tag2
select distinct(movie_id) from Table_Rel_Tag where tag_id = tag1 and tag_id = tag2
这样就获取到了所有同类型的电影的id了
关键字排序 用order by就可以了吧
tag总数有多少个呢?
如果数量不是很多,我之前回答过一个类似的问题,
就是位运算。比如
2 搞笑
4 动作
8 科幻
16 神话
如果包含动作+搞笑,就是6,
如果包含动作+搞笑+科幻,就是14
判断是否同时包含动作加搞笑,只要与6取与就行
要查包含搞笑加科幻,sql 语句就是
select * from table where tag & 6 = 6
因为14&6 = 6,所以包含搞笑,动作,科幻的电影,必然包含动作和搞笑
http://segmentfault.com/q/1010000002429705/a-1020000002430026