首頁 >後端開發 >php教程 >MySQL 多关键字搜索

MySQL 多关键字搜索

WBOY
WBOY原創
2016-06-06 20:39:071145瀏覽

首先,给出数据库设计:

[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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn