关于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上运行
022024-02-26
相似问题