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

使用FIND_IN_SET时GROUP_CONCAT丢失重复值的解决方法

解决GROUP_CONCAT拼接时意外去重的问题

问题场景

现有两张表:

  • skus表:包含plant_species_ids字段,值为1,2,3,2,3,1(逗号分隔的植物ID列表)
  • plant_species表:存储植物ID与对应名称

用LEFT JOIN结合FIND_IN_SET关联两张表后,使用GROUP_CONCAT拼接植物名称,结果自动变成了Plant 1,Plant 2,Plant 3(自动去重),但实际需要保留原顺序的重复值:Plant 1,Plant 2,Plant 3, Plant 2,Plant 3,Plant 1,明明没加DISTINCT却出现去重效果。

问题原因

用FIND_IN_SET做关联条件时,JOIN逻辑会把重复的ID合并成单一行,导致后续GROUP_CONCAT处理的结果集里已经没有重复的名称记录,最终拼接出来的结果就自动去重了。

解决方法

改用JSON_TABLE将逗号分隔的ID字符串拆分成多行数据,再与skus表关联,这样每个ID都会对应独立的行,GROUP_CONCAT就能保留原顺序的重复值。

最终代码

SELECT orders.id, orders.customer_id, orders.invoice_amount, orders.delivery_date, orders.delivery_time, 
       GROUP_CONCAT(skus.name SEPARATOR ', ') as sku_name, 
       orders.sku_ids as sku_ids, orders.sku_weights as sku_weights
FROM orders
JOIN json_table(concat('[',orders.sku_ids,']'), '$[*]' columns (id int path '$')) AS species_ids
LEFT JOIN skus on skus.id=species_ids.id
WHERE orders.id=10
GROUP BY orders.id;

代码说明

  1. concat('[',orders.sku_ids,']'):把逗号分隔的ID字符串转成JSON数组格式(比如1,2,3变成[1,2,3])
  2. JSON_TABLE(...):将JSON数组拆分成多行,每个ID对应一行数据,严格保留原顺序
  3. 关联skus表后,GROUP_CONCAT会按拆分后的行顺序拼接名称,自然保留重复值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:57:12