mysql 一对多 join_Mysql中FIND_IN_SET与JOIN在一对多关系查询时的优劣

Mysql中的FIND_IN_SET函数在我知道它之前,我在做一个一对多的外键查询时,都会在中间设计一个关系表。比如一篇文章(post)对应多个标签(tag),我就会在中间设计一个关系表(post_tag_mapping)来记录文章和标签的对应关系,然后查询某一个标签下的文章时,就用

JOIN

语句来实现了,这也应该是处理一对多关系查询时的标准做法。一般语句就像下面

SELECT * FROM post LEFT JOIN post_tag_mapping WHERE tag_id = 123

但是当我发现

FIND_IN_SET

函数后,就可以完全不用

JOIN

这种查询方式了,我们完全可以在文章表里设置一个类型为SET的标签字段(tags),它存储标签id的格式就像这样

111,222,333

,查询语句就变成了

SELECT * FROM post WHERE FIND_IN_SET('123', tags)

不用做连接查询了,我不知道这两者在查询效率上哪个更占优势?他们的应用场景有什么需要注意的地方?

SET

类型能够做索引吗,做完以后对

FIND_IN_SET

有用吗?

就你的例子来说,用中间(映射)表,可以借助索引提高查询效率。FIND_IN_SET属于字符串操作,如果用在字段上,得全表扫描。

SET类型的实现是64位的bitmap(对应64个成员),作为FIND_IN_SET的第二个参数,可以用位运算来提高函数的效率(不等于查询效率)。限制有:

成员不能包含“,”字符

最多只能有64个成员,而且需要预定义,所以用来做tag不合适

即便加索引也是整体的(即64个位对应的组合状态),而不能针对某一个成员(某一个位)

UPDATE操作也是整体的,你需要自己运算新的bitmap

所以SET最适合用于值域小,取值固定,整体查询的状态集合。比如记录某人去过中国哪些省:可以直接比较两个人是否去过相同的省份,或者直接获得差别,可以高效地查询哪些人只去过某省或某些省,但查哪些人去过某省或某些省依然是扫全表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<h3>回答1:</h3><br/>find_in_set函数是MySQL的一个字符串函数,用于在一个逗号分隔的字符串列表查找一个指定的字符串,并返回其在列表的位置。例如,find_in_set('a', 'a,b,c,d')将返回1,因为字符串'a'在列表的第一个位置。 在实际应用,find_in_set函数通常用于查询某个字段是否包含指定的值。例如,可以使用以下语句查询包含'apple'的记录: SELECT * FROM fruits WHERE find_in_set('apple', fruits_list) > ; 其,fruits_list是一个逗号分隔的字符串列表,包含了所有水果的名称。如果某个记录的fruits_list字段包含了'apple',则该记录将被返回。 需要注意的是,find_in_set函数只能用于逗号分隔的字符串列表,如果列表使用了其他分隔符,该函数将无法正常工作。 <h3>回答2:</h3><br/>find_in_setmysql的一种字符串处理函数,用于在指定的字符串查找指定值是否存在,并返回其在字符串的位置。该函数可以用于将逗号分隔的字符串的值与另一个值进行比较。其语法如下: find_in_set(str,strlist) 其,str是要搜索的字符串,strlist是要搜索的逗号分隔的字符串。 比如说,如果我们有一个students表,其有一个名为hobby的字段,其记录着每个学生的兴趣爱好,多个兴趣爱好之间用逗号隔开,我们希望查询所有喜欢篮球的学生,可以使用如下的sql语句: select * from students where find_in_set('篮球', hobby) > 0; 该语句会返回所有喜欢篮球的学生的记录。如果使用其他的比较符号,比如=、<、>等,可能会出现查询不正确的情况。 需要注意的是,find_in_set函数的性能比较差,因为要对逗号分隔的字符串进行分割,而且只能进行全文搜索。如果有更好的查询条件,建议使用其他的查询方式进行检索。 <h3>回答3:</h3><br/>MySQL的find_in_set函数就是用于在指定字段查找一组值的某一个值是否存在。在MySQL,find_in_set的语法如下: find_in_set('要查找的值','要查询的字段') 其,要查询的字段必须是逗号分隔的多个值,可以是字符串或数字。 find_in_set函数的返回值是布尔值,如果查找到指定值则返回1,否则返回0。因此,在使用find_in_set函数,最好将查询结果用IF语句进行判断和排序。 在实际开发,find_in_set函数通常用于查询带有单选框或多选框的表单数据。例如,假设有一个存储用户兴趣爱好的表格user表,包含两个字段:user_id和interests,而interests字段是一个逗号分隔的字符串,存储用户选择的兴趣爱好。如下: user_id | interests ------- | --------- 1 | 音乐,电影,篮球 2 | 篮球,足球,游戏 3 | 游泳,阅读,旅游 如果想查询所有选择了篮球这个兴趣爱好的用户,则可以使用如下SQL语句: SELECT user_id FROM user WHERE FIND_IN_SET('篮球',interests) > 0; 该SQL语句会返回user_id为1和2的用户,因为他们都选择了篮球作为兴趣爱好。 总结:find_in_set函数是MySQL非常实用的一个查询函数,可以用于查询带有单选框或多选框的表单数据。需要注意的是,在使用find_in_set函数,要确保指定的字段是以逗号分隔的多个值,否则查询结果可能会出现错误。同,在查询结果需要使用IF语句进行判断和排序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值