MySQL与MariaDB中GROUP_CONCAT结果去重技术问询
解决GROUP_CONCAT输出重复值的问题
这问题我日常写SQL时碰到过好多次,核心原因是JOIN操作导致返回的结果行出现重复,GROUP_CONCAT会把这些重复行里的nazwa值都拼进去,自然就出现了多余的重复内容。给你几个实用的解决思路:
1. 直接在GROUP_CONCAT中使用DISTINCT去重
这是最快捷的办法,只需要在GROUP_CONCAT里加上DISTINCT关键字,让它自动忽略重复的nazwa值:
SELECT GROUP_CONCAT(DISTINCT mr.nazwa SEPARATOR ', ') FROM mp06_logos.milkruny AS mr JOIN mp06_logos.milkruny_firmy AS mrf ON mrf.id_milkrun = mr.id WHERE mr.status = 1 AND mrf.id_firmy_zaladunku = 5445 AND mrf.adres_firmy_zaladunku = 5188 ...
这个方案代码改动最小,适合快速解决问题。
2. 先去重再关联,减少重复行
如果两张表关联后产生的重复行特别多,先通过子查询把milkruny表中需要的记录去重,再和milkruny_firmy关联,能提升查询性能:
SELECT GROUP_CONCAT(mr.nazwa SEPARATOR ', ') FROM ( SELECT DISTINCT id, nazwa FROM mp06_logos.milkruny WHERE status = 1 ) AS mr JOIN mp06_logos.milkruny_firmy AS mrf ON mrf.id_milkrun = mr.id WHERE mrf.id_firmy_zaladunku = 5445 AND mrf.adres_firmy_zaladunku = 5188 ...
这样先过滤掉milkruny里的重复项,再做JOIN,从源头上减少了重复行的产生。
3. 检查JOIN条件是否足够严谨
有时候重复是因为关联条件太宽松,导致一条milkruny记录对应多条milkruny_firmy记录。你可以确认下id_milkrun是不是唯一的关联键,或者有没有其他字段可以加到JOIN条件里,比如如果milkruny_firmy里还有和milkruny对应的其他标识,把这些也加上,能避免不必要的关联重复。
内容的提问来源于stack exchange,提问作者user7289982
相关产品推荐
相关产品推荐

