1

过去一天我一直在读这个(甚至在这里),但还没有找到合适的资源,所以我又把它放在那里了:)

看看这两个查询:

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' '389' '343 ''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'

Result Set for query 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 列表的任何想法?

谢谢大家

4

1 回答 1

1

考虑您的第一个查询:

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为每个商店编号选择一个任意的 transactionid。这可能因一种执行方式而异。

我相信同样的事情正在发生在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列(或由它们组成的表达式)排序。

于 2013-04-19T02:53:14.873 回答