Mysql逗号拼接字符串的关联查询 (in条件参数为带逗号的字符串)

今天写代码的时候遇到了一个问题,就是类似于用户表里面有一个字段,存放的是另外一张表主键用逗号拼接的内容,现在想要查询这些主键对应的名称。

类似下面两张表 t_user和t_role

t_user表

iduserNameroleIds
1aaa1,3
2bbb2,3
3ccc1,3,4

t_role表

idroleName
1角色A
2角色B
3角色C
4角色D

现在想要查询的结果如下

iduserNameroleIdsroleNameStr
1aaa1,3角色A,角色C
2bbb2,3角色B,角色C
3ccc1,3,4角色A,角色C,角色D

 

方案一:最开始的方案是先查用户表,将数据返回到服务器,在代码里进行切割,然后再去t_role表里面去查询对应的名称,返回到程序进行拼接。这样做虽然很简单也很好理解但是效率太低。

方案二:想着MySQL有没有类似于split函数的东西,直接切割字符串为数组。但是查询下来发现基本上都是建立在存储过程上面,繁杂、而且不易维护。放弃了这个方案。

方案三:使用FIND_IN_SET函数和GROUP_CONCAT函数进行查询,操作简单,效率高。不过 FIND_IN_SET在数据量打的时候效率比较低,因为它有点类似于like查询。所以当数据量特别大的时候这样做就不太合适了。

总结:如果数据量不是很大可以使用方案三,如果数据量特别大建议使用方案一。因为方案一在数据量很大的情况下添加了索引以后效率会比方案三应该更快。当然最好是建表的时候直接创建一张关联表,这样就可以不使用FIND_IN_SET函数,效率就会很高了。

查询语句如下

SELECT 
*,
(SELECT GROUP_CONCAT(roleName) 
FROM t_role tr 
WHERE FIND_IN_SET(tr.id,(SELECT roleIds FROM t_user WHERE id=tu.id))) AS roleNameStr
FROM t_user tu 

查询结果如下:

基本就是这样了,做个简单记录。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值