今天写代码的时候遇到了一个问题,就是类似于用户表里面有一个字段,存放的是另外一张表主键用逗号拼接的内容,现在想要查询这些主键对应的名称。
类似下面两张表 t_user和t_role
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
查询结果如下:
基本就是这样了,做个简单记录。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97022.html