You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用仅SELECT语句实现MySQL中当前行之前值的拼接?

MySQL 实现拼接当前行之前所有行的ID值

可以仅用SELECT语句实现需求,以下提供两种可行方案:

方案一:基于你的现有语句补全结果

你的更新语句已经接近目标,只是缺少了第一行(ID=1)的记录。可以通过UNION ALL补充该行,并按ID排序得到完整结果:

WITH b AS (
    SELECT id, row_number() OVER(ORDER BY id) r 
    FROM a
)
SELECT c.id, group_concat(b.id) AS concat_prev_to_cur
FROM b 
JOIN b c ON b.r < c.r 
GROUP BY c.r
UNION ALL
SELECT id, NULL AS concat_prev_to_cur
FROM a
WHERE id = (SELECT MIN(id) FROM a)
ORDER BY id;

执行后输出:

+------+-------------------+
| id   | concat_prev_to_cur|
+------+-------------------+
|    1 | null              |
|    3 | 1                 |
|    4 | 1,3               |
+------+-------------------+

方案二:使用窗口函数范围框架(MySQL 8.0.14+)

如果你的MySQL版本是8.0.14及以上,可以利用窗口函数的范围控制直接实现,写法更简洁:

SELECT 
    id,
    GROUP_CONCAT(id) OVER(
        ORDER BY id 
        ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
    ) AS concat_prev_to_cur
FROM a;

这里ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING表示取当前行之前的所有行(从第一行到当前行的前一行),第一行没有前置行,自然返回null,完全匹配你的预期输出。

关于你之前的递归CTE问题

你尝试的递归CTE逻辑存在错误:递归部分的连接条件a.id=b.id会导致无限循环,且没有正确控制行的顺序和累积拼接的逻辑,因此无法得到正确结果。

内容的提问来源于stack exchange,提问作者Fact

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:01:26