今天写sql遇到的问题:
就是 用逗号拼接的字符串在表中去查询另张表的所有数据并且拼接
t_user表
id | userName | roleIds |
1 | aaa | 1,3 |
2 | bbb | 2,3 |
3 | ccc | 1,3,4 |
t_role表
id | roleName |
1 | 角色A |
2 | 角色B |
3 | 角色C |
4 | 角色D |
现在想要查询的结果如下
id | userName | roleIds | roleNameStr |
1 | aaa | 1,3 | 角色A,角色C |
2 | bbb | 2,3 | 角色B,角色C |
3 | ccc | 1,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
查询结果如下:基本就是这样了,做个简单记录。
感谢大哥教程:(2条消息) Mysql逗号拼接字符串的关联查询 (in条件参数为带逗号的字符串)_极速小乌龟的博客-CSDN博客
有一个问题我也是不太理解请大佬指教
查询这条sql 为什么本来不对应的数据却能行 ,WHERE id =tu.id 这个必须写
这个文章表对应, 但是我们公司的业务id不对应 也没什么关联
----- 把用户id 转换成 用户名称 -------
// nickname 用户名称 用户表 id 你需要的表id 你需要操作的表 shenheren
(select GROUP_CONCAT(nickname) from sys_user where id = shenheren) as shenheren,