1

私はこれについて過去1日(ここでも)読んでいましたが、適切なリソースが見つからなかったので、もう一度そこに飛び出しています:)

次の 2 つのクエリを確認してください。

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;

私が読んだすべてのことから、2 つのクエリが同じ結果を返し、2 番目のセットが 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 を削除しても同じ結果が返されるという事実は、GROUP_CONCAT 内で DISTINCT に問題があることを示しています。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 は店舗番号ごとに任意のトランザクション ID を選択します。これは、実行ごとに異なる場合があります。

で同じことが起こっていると思いますgroup_concat()。問題は、選択された任意の数がそれぞれ異なることです。

一貫性が必要な場合は、次の 2 つのクエリを検討してください。

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 に答える