Maison  >  Questions et réponses  >  le corps du texte

php - MySQL 多关键字搜索

首先,给出数据库设计:

[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 ,则可认为是同类型的,结果由关键字的多少排序……

不知道表述清楚没,希望有朋友能帮帮忙~~

PHP中文网PHP中文网2750 Il y a quelques jours414

répondre à tous(4)je répondrai

  • 黄舟

    黄舟2017-04-10 15:18:29

    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进行排序

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-10 15:18:29

    直接看示例吧 http://sqlfiddle.com/#!8/5d7db/10

    假设有movie表,列为 movie_id, movie_name

    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;
    

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-10 15:18:29

    我的思路是这样的
    可以获取到当前电影的tag吧,标记为tag1,tag2
    select distinct(movie_id) from Table_Rel_Tag where tag_id = tag1 and tag_id = tag2
    这样就获取到了所有同类型的电影的id了
    关键字排序 用order by就可以了吧

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-10 15:18:29

    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

    répondre
    0
  • Annulerrépondre