[英]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.