如何实现带DISTINCT与不带DISTINCT的GROUP_CONCAT返回结果一致
问题根因
- 未显式指定
ORDER BY时,普通GROUP_CONCAT是按关联查询返回的行原始顺序拼接字符串;带DISTINCT的GROUP_CONCAT为了实现去重逻辑,内部会先对字段值做排序再去重拼接,二者默认排序规则不一致,自然结果顺序不同。 - 你之前仅给带
DISTINCT的GROUP_CONCAT添加了排序规则,未给普通GROUP_CONCAT添加相同规则,二者排序逻辑仍不统一,因此会出现修改后依然不匹配的情况。
解决方案
给两个GROUP_CONCAT都显式指定完全相同的ORDER BY规则即可,修改后的SQL如下:
SELECT GROUP_CONCAT(a.artiste_nom ORDER BY a.artiste_nom ASC SEPARATOR '|') as 'std', GROUP_CONCAT(DISTINCT a.artiste_nom ORDER BY a.artiste_nom ASC SEPARATOR '|') as 'std1' FROM produit p INNER JOIN produit_artiste pa ON pa.produit_id = p.produit_id INNER JOIN artiste a ON pa.artiste_id = a.artiste_id GROUP BY p.produit_id HAVING std <> std1
注:你原SQL中用LEFT JOIN后又加了
WHERE pa.produit_id = p.produit_id的条件,相当于把左连接强制转为了内连接,直接改成INNER JOIN逻辑更清晰,不会影响查询结果。
补充说明
如果需要保留原始行顺序的同时让二者结果匹配,可以先对关联后的结果集按你需要的顺序做全局排序,再嵌套一层做聚合操作,示例如下:
SELECT GROUP_CONCAT(t.artiste_nom SEPARATOR '|') as 'std', GROUP_CONCAT(DISTINCT t.artiste_nom ORDER BY FIELD(t.artiste_nom, t.order_list) SEPARATOR '|') as 'std1' FROM ( SELECT p.produit_id, a.artiste_nom FROM produit p INNER JOIN produit_artiste pa ON pa.produit_id = p.produit_id INNER JOIN artiste a ON pa.artiste_id = a.artiste_id ORDER BY pa.id ASC -- 此处按你需要的原始顺序字段排序,比如关联表的自增ID ) t GROUP BY t.produit_id HAVING std <> std1
内容的提问来源于stack exchange,提问作者wannabesenior
相关产品推荐
相关产品推荐

