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 .
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.
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.
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.
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.
Jawaban:
sumber
Ya, Anda dapat mengelompokkan berdasarkan beberapa kolom. Sebagai contoh,
Hasilnya pertama-tama akan dikelompokkan berdasarkan col1, kemudian oleh col2. Di MySQL, preferensi kolom bergerak dari kiri ke kanan.
sumber
GROUP BY
berlakucol1+col2
. egcol1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2
dan berlariGROUP BY col1,col2
akan kembali1,1|1,3|2,2
berlawanan dengan yang1,1|2,2
disarankan. SedangkanGROUP BY col2, col1
akan 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 untuk2,2
meskipun membalik kolom.GROUP BY
). Dan jika dalam kolom yang didefinisikan pertama ada hasil yang sama, maka hanya dalam hasil yang sama macam dengan kolom yang didefinisikan keduaSUM
menggunakan denganGROUP BY
. JikaGROUP BY
hanya dengan satu kolom, makaSUM
s semua nilai masing-masing berbeda (berbeda) nilai kolom sqlfiddle.com/#!9/1cbde2/2 . JikaGROUP BY
dua kolom. Kemudian mysql pada pemeriksaan pertama jika untuk nilai kolom pertama ada nilai yang berbeda di kolom kedua. Jika ya, maka mysqlSUM
masing-masing nilai berbeda dari kolom kedua sqlfiddle.com/#!9/1cbde2/1 .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.
sumber
sumber
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.
sumber
Jika Anda lebih suka (saya perlu menerapkan ini) grup dengan dua kolom secara bersamaan, saya baru saja melihat poin ini:
sumber
SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2
. Hasilnya biasanya akan terlihat sama dengan jawaban ini, tetapi eksekusi internal sangat berbeda.sumber
GROUP BY col1, col2
. Ini akan memberikan hasil yang salah dengan beberapa data. Katakancol1, col2
memiliki 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.SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;