关于Group_concat() 函数的使用

来源:6-8 推演JSON_CONTAINS()函数的结果去重

qq_慕侠7574446

2023-12-31

不同点:
不需要子查询,不需要去重
可以利用分组去重,再使用group_concat()函数效果一样,且mycat不会报错。
问题:不知道这样是否有隐藏问题

原sql:

/*!mycat: sql=
SELECT DISTINCT u.id,
       u.username,
			 ( 
				SELECT GROUP_CONCAT( role_name separator "," ) 
				FROM tb_role 
				WHERE JSON_CONTAINS ( u.role, CONVERT (id, CHAR) ) 
			) AS roles
FROM tb_user u
JOIN tb_role r ON JSON_CONTAINS ( u.role, CONVERT (r.id, CHAR) )
WHERE  u.name="超级管理员"
*/
SELECT DISTINCT u.id,
       u.username,
			 ( 
				SELECT GROUP_CONCAT( role_name separator "," ) 
				FROM tb_role 
				WHERE JSON_CONTAINS ( u.role, CONVERT (id, CHAR) ) 
			) AS roles
FROM tb_user u
JOIN tb_role r ON JSON_CONTAINS ( u.role, CONVERT (r.id, CHAR) )
WHERE  u.name="超级管理员"

改变后sql:

SELECT  u.id,
				u.username,
				GROUP_CONCAT(r.role_name)  AS roleName
FROM tb_user u
JOIN tb_role r ON JSON_CONTAINS ( u.role, CONVERT ( r.id, CHAR ) )
WHERE  u.name="超级管理员"  GROUP BY u.id;

效果:
图片描述

xml代码(自己添加分页插件所以没有limit):

<select id="searchByPage" parameterType="Map" resultType="java.util.HashMap">
        SELECT  u.id,
        u.name,
        u.sex,
        u.tel,
        u.email,
        d.dept_name AS dept,
        u.hiredate,
        u.root,
        u.status,
        GROUP_CONCAT(r.role_name) AS roles
        FROM tb_user u
        JOIN tb_role r ON JSON_CONTAINS ( u.role, CONVERT (r.id, CHAR) )
        LEFT JOIN tb_dept d ON u.dept_id = d.id
        WHERE 1=1
        <if test="name != null and name != ''">
            AND u.name LIKE "%${name}%"
        </if>
        <if test="sex!=null">
            AND u.sex=#{sex}
        </if>
        <if test="role!=null">
            AND r.role_name=#{role}
        </if>
        <if test="deptId!=null">
            AND d.id=#{deptId}
        </if>
        <if test="status!=null">
            AND u.status=#{status}
        </if>
        group by u.id
        ORDER BY u.id ASC
    </select>

结果:
图片描述

写回答

1回答

神思者

2023-12-31

你是在mysql节点上运行的,你把sql语句放到MyCat上运行

0
2
Hellooooooo
回复
qq_慕侠7574446
我试了一下,确实可以,不执行后面的GROUP BY u.id语句也是对的
2024-02-26
共2条回复

SpringBoot+Vue3+MySQL集群 开发大健康体检双系统

SpirngBoot+Vue3+ MySQL集群 开发大健康体检双系统

318 学习 · 213 问题

查看课程