MySQLを使用して複数の列をGROUP BYすることは可能ですか?


206

GROUP BYMySQL SELECTクエリで複数の列を使用することはできますか?例えば:

GROUP BY fV.tier_id AND 'f.form_template_id'

3
行ごとにグループ化することはできません。ただし、列でグループ化することもできます
Joe Phillips、


1
複数のgroup by句を使用する代わりに、サブクエリを実行する必要がある場合があります。
アダムF

投票数の多い回答のほとんどは基本的に互いに同じですが(正しい構文を示し、2つの列の順序を切り替える効果を説明しています)、ニーズが多少異なる場合は、Danikladの回答を検討してください
ToolmakerSteve

回答:



107

はい、複数の列でグループ化できます。例えば、

SELECT * FROM table
GROUP BY col1, col2

結果はまずcol1でグループ化され、次にcol2でグループ化されます。MySQLでは、列の優先順位は左から右に移動します。


5
左から右への優先順位は、列グループの優先順位ではなく、グループ化の昇順に適用されます。GROUP BY適用しますcol1+col2。たとえばcol1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2、提案されているのとは対照的に、実行GROUP BY col1,col2すると戻ります。一方、col2が返される昇順を変更します。 デモ:sqlfiddle.com / #!9 / d5f69 /1 列を反転しても、行ID:2が両方のケースで返されることに注意してください。1,1|1,3|2,21,1|2,2GROUP BY col2, col11,1|2,2|1,32,2
fyrye 2016年

もう1つのテスト。sqlfiddle.com/#!9/5c8763/2結論。最初に、mysqlは最初に定義された列(GROUP BY)。そして、最初に定義された列に等しい結果がある場合、等しい結果内でのみ、2番目に定義された列でソートされます
user2360831

でのSUM使用についてGROUP BYGROUP BY列が1つだけの場合はSUM、列値sqlfiddle.com/#!9/1cbde2/2のそれぞれの(異なる)それぞれのすべての値。GROUP BY2列の場合。次に、mysqlは最初に最初の列の値について、2番目の列に異なる値があるかどうかをチェックします。はいの場合SUM、2番目の列sqlfiddle.com/#!9/1cbde2/1のそれぞれ異なる値をmysqlします。
user2360831

23

はい、でも2列以上でグループ化するとどうなりますか?これは、行ごとに一意のペアごとにグループ化するのと同じです。列をリストする順序は、行のソート方法を変更します。

あなたの例では、あなたは書くでしょう

GROUP BY fV.tier_id, f.form_template_id

一方、コード

GROUP BY f.form_template_id, fV.tier_id

同様の結果が得られますが、並べ替えが異なります。



13

簡単な例を使用すると、サイトの訪問されたページごとに一意のIPアドレスを要約する必要があるカウンターがありました。基本的には、ページ名でグループ化してからIPでグループ化します。DISTINCTとGROUP BYを組み合わせて解決しました。

SELECT pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;

2
この回答は他の回答とは多少異なる問題を解決するため、注目に値します。
ToolmakerSteve

5

必要に応じて(これを適用する必要があります)同時に2列でグループ化すると、この点がわかりました。

SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1

1
ラダの答えの下でypercubeのコメントを参照してください。代替案として検討してくださいSELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2。結果は通常この回答と同じに見えますが、内部の実行はかなり異なります。
ToolmakerSteve

-2
GROUP BY CONCAT(col1, '_', col2)

37
質問が回答されてから4年後に投稿された1行のコードでの回答が8(8!)の賛成票を獲得するのはどうでしょうか。遅くて短いだけでなく、不正確で非効率でもあります。
ypercubeᵀᴹ

8
@ypercubeᵀᴹなぜそれが正しくないと言うのですか?これはまさに私が探していたものであり、「複数列によるグループ化」の正しい解釈です。実際、なぜこれが "group by col1、col2"の動作ではないのかはわかりません
Abram

3
@Abramがpingを送信するので、NeverEndingQueueに対する私の返信が表示されます。欠点:よりもはるかに少ない-効率的ですGROUP BY col1, col2。一部のデータでは誤った結果が得られます。セイは、col1, col2値を有する:('a_b', 'c')一列にし、('a', 'b_c')別ので。GROUP BY CONCATを使用したこの間違った答えは、2つの行を1つに集約します。正解はしません。
ypercubeᵀᴹ

1
必要に応じて、SELECTリストでCONCAT式を使用することをSELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
妨げる

1
@ypercubeᵀᴹおっと、愚かに私は「group by foo、bar」が「... group by foo union ... group by bar」のように振る舞うと思っていました。それは確かにGROUP BY CONCATにとって異常なケースです。
エイブラム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.