【问题标题】:GROUP_CONCAT(DISTINCT xxx) reverse the order of the concatened valuesGROUP_CONCAT(DISTINCT xxx) 反转连接值的顺序
【发布时间】:2021-10-27 09:38:43
【问题描述】:

当我比较这两个 GROUP_CONTACT 时,我的 sql 请求遇到了一些问题, 结果似乎是相反的。我试图将订单语句放入 group_concat 但没有成功。

如何在没有 DISTINCT 语句的 GROUP_CONCAT 和使用 DISTINCT 语句的 GROUP_CONCAT 之间获得相同的结果。

SELECT GROUP_CONCAT(a.artiste_nom SEPARATOR '|') as 'std', GROUP_CONCAT(DISTINCT a.artiste_nom SEPARATOR '|') as 'std1'
FROM produit p
LEFT JOIN produit_artiste pa ON pa.produit_id = p.produit_id 
LEFT JOIN artiste a ON pa.artiste_id = a.artiste_id
WHERE pa.produit_id = p.produit_id
GROUP BY p.produit_id 
HAVING std <> std1

使用 GROUP_CONCAT(DISTINCT a.artiste_nom ORDER BY a.artiste_nom ASC SEPARATOR '|') 完全没有区别

GROUP_CONCAT(DISTINCT a.artiste_nom ORDER BY a.artiste_nom DESC SEPARATOR '|') 改变了表格的解析方式。

【问题讨论】:

  • 你的语法错误:
  • GROUP_CONCAT(a.artiste_nom ORDER BY column SEPARATOR '|' ) 但它没有用
  • 没用 ORDER BY 之后得到的值排序是由使用的排序规则定义的。如果在您看来排序与指定的排序不匹配,那么您将看不到某些东西。例如,有一些符号在视觉上看起来像另一个符号,但在当前排序规则中的优先级较低。您可以使用例如 HEX() 检查您实际看到的内容。尝试在一些在线小提琴上重现您的问题。

标签: mysql sql mariadb


【解决方案1】:

您可以在GROUP_CONCAT 中使用ORDER BY 参数指定顺序。

尝试使用:

GROUP_CONCAT(a.artiste_nom ORDER BY a.artiste_nom ASC SEPARATOR '|')

或使用DISTINCT 以确保重复值仅连接一次

GROUP_CONCAT(DISTINCT a.artiste_nom ORDER BY a.artiste_nom ASC SEPARATOR '|')

见:Maria DB Group Concat Document

【讨论】:

  • 我需要使用 dstinct 对 group_concat 进行排序
  • @wannabesenior 见this answer
【解决方案2】:

GROUP_CONCAT(DISTINCT(a.artiste_nom) ORDER BY a.artiste_id ASC SEPARATOR '|') 做了这项工作。 (似乎 DISTINCT 颠倒了 id 的顺序)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2011-03-06
    • 2013-08-21
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多