首页 > 解决方案 > 来自组的路径

问题描述

我有以下数据:

╔════╦═══════╦═══════╗
║ 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 ║
╚═══════╩════════════╝

标签: mysqlsqlgroup-by

解决方案


假设最终目标是按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`;

推荐阅读