使用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;
代码说明
concat('[',orders.sku_ids,']'):把逗号分隔的ID字符串转成JSON数组格式(比如1,2,3变成[1,2,3])JSON_TABLE(...):将JSON数组拆分成多行,每个ID对应一行数据,严格保留原顺序- 关联
skus表后,GROUP_CONCAT会按拆分后的行顺序拼接名称,自然保留重复值
内容的提问来源于stack exchange,提问作者Scott Paterson
相关产品推荐
相关产品推荐

