Apakah mungkin mengelompokkan berdasarkan beberapa kolom menggunakan MySQL?

206

Apakah mungkin untuk GROUP BYlebih dari satu kolom dalam SELECTpermintaan MySQL ? Sebagai contoh:

GROUP BY fV.tier_id AND 'f.form_template_id'
Pikiran Rhys
sumber
3
Anda tidak dapat mengelompokkan menurut baris. Anda dapat mengelompokkan berdasarkan kolom
Joe Phillips
Apa versi sintaks ini: stackoverflow.com/questions/2421388/...
Ciro Santilli郝海东冠状病六四事件法轮功
1
Anda mungkin perlu melakukan subquery daripada menggunakan beberapa grup dengan klausa.
Adam F
Sementara sebagian besar jawaban pilihan pada dasarnya sama satu sama lain (mereka menunjukkan sintaks yang benar, dan menjelaskan efek beralih urutan kedua kolom), jika kebutuhan Anda agak berbeda, pertimbangkan jawaban Daniklad .
ToolmakerSteve

Jawaban:

292
GROUP BY col1, col2, col3
Joe Phillips
sumber
107

Ya, Anda dapat mengelompokkan berdasarkan beberapa kolom. Sebagai contoh,

SELECT * FROM table
GROUP BY col1, col2

Hasilnya pertama-tama akan dikelompokkan berdasarkan col1, kemudian oleh col2. Di MySQL, preferensi kolom bergerak dari kiri ke kanan.

php
sumber
5
Preferensi dari kiri ke kanan diterapkan pada urutan naik dari pengelompokan dan bukan preferensi grup kolom. GROUP BYberlaku col1+col2. eg col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2dan berlari GROUP BY col1,col2akan kembali 1,1|1,3|2,2berlawanan dengan yang 1,1|2,2disarankan. Sedangkan GROUP BY col2, col1akan mengubah urutan naik dari col2 kembali. 1,1|2,2|1,3 Demo: sqlfiddle.com/#!9/d5f69/1 Perhatikan bahwa id baris: 2 dikembalikan dalam kedua kasus untuk 2,2meskipun membalik kolom.
fyrye
Satu pengujian lagi. sqlfiddle.com/#!9/5c8763/2 Kesimpulan. Pada mulanya mysql mengurutkan berdasarkan kolom yang didefinisikan pertama (dengan GROUP BY). Dan jika dalam kolom yang didefinisikan pertama ada hasil yang sama, maka hanya dalam hasil yang sama macam dengan kolom yang didefinisikan kedua
user2360831
Mengenai SUMmenggunakan dengan GROUP BY. Jika GROUP BYhanya dengan satu kolom, maka SUMs semua nilai masing-masing berbeda (berbeda) nilai kolom sqlfiddle.com/#!9/1cbde2/2 . Jika GROUP BYdua kolom. Kemudian mysql pada pemeriksaan pertama jika untuk nilai kolom pertama ada nilai yang berbeda di kolom kedua. Jika ya, maka mysql SUMmasing-masing nilai berbeda dari kolom kedua sqlfiddle.com/#!9/1cbde2/1 .
user2360831
23

Ya, tetapi apa pengelompokan berdasarkan dua kolom? Yah, itu sama dengan pengelompokan berdasarkan setiap pasangan unik per baris. Urutan Anda membuat daftar kolom mengubah cara baris diurutkan.

Dalam contoh Anda, Anda akan menulis

GROUP BY fV.tier_id, f.form_template_id

Sementara itu, kodenya

GROUP BY f.form_template_id, fV.tier_id

akan memberikan hasil yang serupa, tetapi diurutkan secara berbeda.

brandonCabi
sumber
17
group by fV.tier_id, f.form_template_id
Trevor
sumber
13

Untuk menggunakan contoh sederhana, saya memiliki penghitung yang perlu meringkas alamat IP unik per halaman yang dikunjungi di situs. Yang pada dasarnya adalah pengelompokan oleh pagename dan kemudian oleh IP. Saya menyelesaikannya dengan kombinasi DISTINCT dan GROUP BY.

SELECT pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;
Daniklad
sumber
2
Jawaban ini patut dicatat, karena memecahkan masalah yang agak berbeda dari jawaban lainnya.
ToolmakerSteve
5

Jika Anda lebih suka (saya perlu menerapkan ini) grup dengan dua kolom secara bersamaan, saya baru saja melihat poin ini:

SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1
Lucas Andrade
sumber
1
Lihat komentar ypercube di bawah jawaban lada. Pertimbangkan sebagai alternatif: SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2. Hasilnya biasanya akan terlihat sama dengan jawaban ini, tetapi eksekusi internal sangat berbeda.
ToolmakerSteve
-2
GROUP BY CONCAT(col1, '_', col2)
lada
sumber
37
Saya bertanya-tanya bagaimana jawaban hanya dengan satu baris kode, diposting 4 tahun setelah pertanyaan dijawab mendapat 8 (delapan!) Upvotes. Sementara juga menjadi salah dan tidak efisien selain terlambat dan pendek.
ypercubeᵀᴹ
8
@ ypercubeᵀᴹ mengapa Anda mengatakan itu salah? Inilah yang saya cari, dan interpretasi yang benar dari "grup dengan banyak kolom". Bahkan, saya tidak tahu mengapa ini bukan perilaku "kelompok demi col1, col2" seperti yang saya harapkan
Abram
3
@Abram mem-ping kamu, jadi kamu melihat balasanku untuk NeverEndingQueue. Kelemahan: kurang - jauh lebih sedikit - efisien daripada GROUP BY col1, col2. Ini akan memberikan hasil yang salah dengan beberapa data. Katakan col1, col2memiliki nilai: ('a_b', 'c')di satu baris dan ('a', 'b_c')di baris lain. Jawaban yang salah ini, dengan GROUP BY CONCAT akan mengagregasi dua baris dalam satu. Jawaban yang benar tidak akan.
ypercubeᵀᴹ
1
Tidak ada yang menghentikan Anda dari menggunakan ekspresi CONCAT dalam daftar SELECT, jika Anda membutuhkannya:SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
ypercubeᵀᴹ
1
@ ypercubeᵀᴹ oops, bodohnya aku berpikir "kelompok demi foo, bar" berperilaku seperti "... grup demi serikat ... grup demi bar". Ini akan menjadi kasus yang tidak biasa bagi GROUP BY CONCAT.
Abram