簡體   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