繁体   English   中英

MySQL GROUP_CONCAT DISTINCT 排序异常

[英]MySQL GROUP_CONCAT DISTINCT ordering anomaly

过去一天我一直在阅读有关此内容的内容(甚至在这里),但没有找到合适的资源,所以我再次将其弹出:)

看看这两个查询:

SELECT DISTINCT transactions.StoreNumber FROM transactions WHERE PersonID=2 ORDER BY transactions.transactionID DESC;

SELECT GROUP_CONCAT(DISTINCT transactions.StoreNumber ORDER BY transactions.transactionID DESC SEPARATOR ',') FROM transactions WHERE PersonID=2 ORDER BY transactions.transactionID DESC;

从我读过的所有内容中,我希望这两个查询返回相同的结果,第二个集合分组到 CSV 中。 然而他们不是。

查询1的结果集(把每个值都画在自己的行里,这里格式化结果很麻烦):

'611' '345' '340' '310' '327' '323' '362' '360' '330' '379' '356' '367' '375' '306' '354' '3439' ''346' '357' '733' '370' '347' '703' '355' '341' '342' '358' '351' '319' '365' '372' '368' '353' 363''349''369''336''364''202''366''416''731'

结果集中查询2:611,379,375,389,703,355,351,372,368,362,342,365,353,341,733,347,336,319,354,306,345,364,202,358,370,343,366,349,356,367,369,416,323,346,731,360,363,330,310,357,340,327

如果我删除 DISTINCT 子句,结果会对齐。

任何人都可以指出我在上述查询之间的差异方面做错了什么?

从每个查询中删除 DISTINCT 返回相同结果的事实表明 DISTINCT 在 GROUP_CONCAT 中存在问题。 在 GROUP_CONCAT 之外执行 GROUP BY 会导致返回多行,这不是我想要的。

关于如何按 TransactionID DESC 的顺序获取 StoreNumber 的 GROUP_CONCAT DISTINCT 列表的任何想法?

谢谢大家

考虑您的第一个查询:

SELECT DISTINCT transactions.StoreNumber
FROM transactions
WHERE PersonID=2
ORDER BY transactions.transactionID DESC;

这相当于:

SELECT transactions.StoreNumber
FROM transactions
WHERE PersonID=2
group by transactions.StoreNumber
ORDER BY transactions.transactionID DESC;

您正在订购不在select列表中的东西。 因此,MySQL 为每个商店编号选择一个任意的事务 ID。 这可能因一次执行而异。

我相信group_concat()正在发生同样的事情。 问题是每个人选择的任意数字都不同。

如果您想要一致性,请考虑以下两个查询:

SELECT transactions.StoreNumber
FROM transactions
WHERE PersonID=2
group by transactions.StoreNumber
ORDER BY min(transactions.transactionID) DESC;

和:

SELECT GROUP_CONCAT(DISTINCT t.StoreNumber ORDER BY t.mintransactionID DESC SEPARATOR ',')
FROM (select t.StoreNumber, min(TransactionId) as minTransactionId
      from transactions t
      WHERE PersonID=2.transactionID
      group by t.StoreNumber
     ) t

这些应该产生相同的结果。

在您大声抱怨 MySQL 之前,任何其他数据库都会在第一次查询时返回错误,因为在使用select distinct ,您只能按select列表中的列(或由它们组成的表达式)进行排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM