MySQL GROUP_CONCAT DISTINCT命令异常

时间:2013-04-19 00:23:12

标签: mysql group-concat

我在过去的一天(甚至在这里)一直在阅读这篇文章,并且没有找到合适的资源,所以我再次把它弹出来了:)

查看以下两个查询:

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'

查询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列表的任何想法?

全部谢谢

1 个答案:

答案 0 :(得分: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列表中的列(或表达式)排序由他们组成)。