Loading... ![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b59c27027de846adbe21dbe4715b1ee7~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?) #### GROUP_CONCAT(expr) 组连接函数 **GROUP_CONCAT(expr)** 组连接函数可以返回分组后指定字段的字符串连接形式,并且可以指定排序逻辑,以及连接字符串,默认为英文逗号连接。这里继续用 order_diy 表举例:sql 如下: ```sql SELECT name, GROUP_CONCAT(title ORDER BY id desc SEPARATOR '-') from order_diy GROUP BY name ORDER BY NULL; ``` 查询结果:![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5b843a7302af41108bd87a08b900e686~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?) 如上我们通过 **GROUP_CONCAT(title ORDER BY id desc SEPARATOR '-')** 语句,指定分组连接 title 字段并按照 id 排序,设置连接字符串为 `-`。 #### 自连接查询 自连接查询是 sql 语法里常用的一种写法,掌握了自连接的用法我们可以在 sql 层面轻松解决很多问题。这里用 tree 表举例,结构以及表数据展示: ![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3661774b6e904dcc931d128bd9cbcdcc~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?) tree 表中通过 pid 字段与 id 字段进行父子关联,假如现在有一个需求,我们想按照父子层级将 tree 表数据转换成 `一级职位 二级职位 三级职位` 三个列名进行展示,sql 如下: ```sql SELECT t1.job_name '一级职位', t2.job_name '二级职位', t3.job_name '三级职位' from tree t1 join tree t2 on t1.id = t2.pid left join tree t3 on t2.id = t3.pid where t1.pid = 0; ``` 结果如下:![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/172447faa2e24abeaba9bc65af0f6f1f~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?) 我们通过 **tree t1 join tree t2 on t1.id = t2.pid** 自连接展示 `一级职位 二级职位`,再用 **left join tree t3 on t2.id = t3.pid** 自连接展示 `二级职位 三级职位`,最后通过**where 条件 t1.pid = 0**过滤掉非一级职位的展示,完成这个需求。 #### with rollup 在分组统计数据的基础上再进行统计汇总 MySql 中可以使用 with rollup 在分组统计数据的基础上再进行统计汇总,即用来得到 group by 的汇总信息。这里继续用order_diy 表举例,sql 如下: ```sql SELECT name, SUM(money) as money FROM order_diy GROUP BY name WITH ROLLUP; ``` 查询结果: ![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c80c34afd662457bba44708d5808289e~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?) 可以看到通过 **GROUP BY name WITH ROLLUP** 语句,查询结果最后一列显示了分组统计的汇总结果。但是 name 字段最后显示为 null,我们可以通过 `coalesce(val1, val2, ...)` 函数,这个函数会返回参数列表中的第一个非空参数。 ```sql SELECT coalesce(name, '总金额') name, SUM(money) as money FROM order_diy GROUP BY name WITH ROLLUP; ``` 查询结果: ![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/64be9f20b10442e786444b9764f75915~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?) 转载自 [https://juejin.cn/post/7209625823580766264](https://juejin.cn/post/7209625823580766264) -------------------------------后续有新知识再更新 最后修改:2023 年 06 月 20 日 © 允许规范转载 打赏 赞赏作者 赞 如果觉得我的文章对你有用,请随意赞赏