当前位置:   article > 正文

Mysql逗号拼接字符串的关联查询 (in条件参数为带逗号的字符串)_mysql中一个字段用逗号拼接,入参也是有个逗号拼接的字符串,查询有交集的记录

mysql中一个字段用逗号拼接,入参也是有个逗号拼接的字符串,查询有交集的记录

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

类似下面两张表 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函数,效率就会很高了。

查询语句如下

  1. SELECT
  2. *,
  3. (SELECT GROUP_CONCAT(roleName)
  4. FROM t_role tr
  5. WHERE FIND_IN_SET(tr.id,(SELECT roleIds FROM t_user WHERE id=tu.id))) AS roleNameStr
  6. FROM t_user tu

查询结果如下:

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号