热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

MySQL多关键字搜索

首先,给出数据库设计:[Table_Rel_Tag]#记录电影与其标签的关系表movie_id,tag_id[Table_Tag]tag_id,tag_name现在我有一部电影,《功夫》(movie_id1)比如,它的tag就是:搞笑(Tag_id1),动作(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 ,则可认为是同类型的,结果由关键字的多少排序……

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

回复内容:

首先,给出数据库设计:

[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

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;

我的思路是这样的
可以获取到当前电影的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

推荐阅读
  • 理解 Hibernate 中的 fetch 和 lazy 属性配置
    本文探讨了在 Hibernate 中如何利用 fetch 和 lazy 属性来优化数据查询效率。通过调整这两个参数,可以有效管理数据库查询的性能,减少不必要的资源消耗。 ... [详细]
  • 深入理解聚簇索引与非聚簇索引及其优化策略
    本文探讨了数据库性能优化中的关键因素——索引,特别是聚簇索引与非聚簇索引的区别及应用场景。通过实例分析,提供了如何有效利用这两种索引来提升数据库查询性能的方法。 ... [详细]
  • 本文探讨了在使用MySQL数据库时遇到的一些基本问题,如连接失败和语句执行错误,并提供了多个有效的解决方案。 ... [详细]
  • 本文详细介绍了Oracle数据库中审计日志(audit trail)的配置方法及各参数选项的功能,包括如何启用系统范围的审计记录,以及如何将审计数据存储在不同的位置和格式。 ... [详细]
  • 本文探讨了SQL Server中以sp_开头的存储过程特性及其对数据库执行上下文的影响。通过分析执行规则和潜在问题,提供了解决方案,确保存储过程能够正确访问所需对象。 ... [详细]
  • API网关作为微服务架构中的关键组件,扮演着系统与外部世界交互的唯一接口角色。它不仅封装了系统的内部复杂性,还为不同客户端提供了个性化的API接口。本文将探讨API网关的重要性及其核心功能。 ... [详细]
  • 收割机|篇幅_国内最牛逼的笔记,不接受反驳!!
    收割机|篇幅_国内最牛逼的笔记,不接受反驳!! ... [详细]
  • 本文介绍了在T-SQL中如何有效地进行字符串分割以及如何将多行字符串合并为单行的方法,提供了具体的函数实现和示例。 ... [详细]
  • 本文介绍了Kettle资源库的基本概念、类型及其管理方法,同时探讨了Kettle的不同运行方式,包括图形界面、命令行以及API调用,并详细说明了日志记录的相关配置。 ... [详细]
  • 探讨了汉字在计算机系统中的字符占用情况,以及在使用SQL Server 2000进行特定条件查询时遇到的问题,特别是针对姓氏为‘刘’的学生记录的查询。 ... [详细]
  • 本文深入探讨了在MySQL数据库中利用innobackupex工具进行备份,并结合binlog日志实现数据库的完整恢复过程。适合对数据库管理和维护有一定需求的技术人员阅读。 ... [详细]
  • Pikachu SQL注入实战解析
    作为一名网络安全新手,本文旨在记录个人在SQL注入方面的学习过程与心得,以备后续复习之用。通过逐步深入的学习,力求掌握每个知识点后再向下一个挑战迈进。 ... [详细]
  • Spring Boot + MyBatis Plus 实现SQL语句打印的两种方法
    本文详细介绍了如何在Spring Boot和MyBatis Plus环境中实现SQL语句打印的两种方法,包括配置文件设置和多数据源环境下的动态配置。适合开发者在日常开发和调试过程中参考。 ... [详细]
  • PHP中静态类与静态变量的应用差异探讨
    本文深入探讨了PHP编程语言中静态类与静态变量的具体应用及其差异性,旨在帮助开发者更好地理解和运用这些概念,以提升代码质量和效率。 ... [详细]
  • 如何解决PHP中时间获取不准确的问题
    本文探讨了在PHP开发过程中遇到的时间获取错误问题,并提供了详细的解决方案,包括通过修改配置文件和编程方法来调整时区设置。 ... [详细]
author-avatar
ruanpinger
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有