mysql - 来自组的路径
问题描述
我有以下数据:
╔════╦═══════╦═══════╗ ║ id ║ 群组 ║ 地点 ║ ╠════╬═══════╬═══════╣ ║ 1 ║ 1 ║ 一 ║ ║ 2 ║ 1 ║ b ║ ║ 3 ║ 1 ║ b ║ ║ 4 ║ 1 ║ 一 ║ ║ 5 ║ 1 ║ c ║ ║ 6 ║ 2 ║ 一 ║ ║ 7 ║ 2 ║ b ║ ║ 8 ║ 2 ║ c ║ ╚════╩═══════╩═══════╝
如何获取 MySQL 中每个组的路径?
预期结果是:
╔═══════╦════════════╗ ║组║路径║ ╠═══════╬════════════╣ ║ 1 ║ 算盘 ║ ║ 2 ║ abc ║ ╚═══════╩════════════╝
解决方案
假设最终目标是按group
和排序id
,然后简化每个组的序列,使连续重复的位置只显示一次:
首先确定每一行的地点或组自上一行以来是否发生了变化。在这个答案中有一个很好的解决方案。
然后使用GROUP_CONCAT
将这些地方合并成一条路径。
请注意,它GROUP_CONCAT
具有用户可配置的最大长度,默认情况下为 1,024 个字符。
SELECT
`group`,
GROUP_CONCAT(place ORDER BY id SEPARATOR '-') path
FROM
(SELECT
COALESCE(@place != place OR @group != `group`, 1) changed,
id,
@group:=`group` `group`,
@place:=place place
FROM
place_table, (SELECT @place:=NULL, @group:=NULL) s
ORDER BY `group`, id) t
WHERE
changed = 1
GROUP BY `group`;
推荐阅读
- javascript - 如何使用 Google My Business API 获取位置列表
- vue.js - Two compile cases with Webpack, Vue.js, and Sass
- google-sheets - 在 ArrayFormula Google 表格中使用 SUMIFS
- php - 如何使用 php 在微软企业帐户中以可编辑格式打开文档?
- macos - 在 Mac OS high Sierra 上设置 KaiOS 环境
- cordova - Ionic 3 API 授权
- ios - ADAL 身份验证需要设备管理
- android - Unity Android 构建中的纵横比
- ng-packagr - 如何将我的 tsconfig 文件与 ng-packagr 一起使用?
- mysql - MySQL 在将十六进制转换为二进制时去除前导零