2013-04-19 47 views
1

我一直在閱讀有關這在過去的一天(甚至在這裏),並沒有找到合適的資源,所以我有再次彈出出來:)MySQL的GROUP_CONCAT DISTINCT訂貨異常

查閱這些兩個查詢:

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

考慮您的第一個查詢:

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

你被東西是不是在select列表排序:

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

這到是等價的。因此,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 

這些應該產生相同的結果。因爲在使用select distinct時,只能按select列表(或由它們組成的表達式)中的列進行排序。因爲在使用select distinct時,您只能按列表排序(或由它們組成的表達式)排序。

+0

謝謝戈登 - 這解釋了很多,並完美地整理了我的問題。 – w001y