SELECT * FROM my_table GROUP BY section_identifier
adalah SQL
. yang tidak valid kueri.
Bagaimana GROUP BY
berhasil?
Mari dapatkan kueri di atas dan lihat caranya GROUP BY
bekerja. Pertama mesin database memilih semua baris yang cocok dengan WHERE
ayat. Tidak ada WHERE
klausa dalam kueri ini; ini berarti semua baris tabel digunakan untuk menghasilkan kumpulan hasil.
Kemudian mengelompokkan baris menggunakan ekspresi yang ditentukan dalam GROUP BY
klausa:
+----+--------------------+----------------------+----------+
| id | section_identifier | option_identifier | store_id |
+----+--------------------+----------------------+----------+
| 17 | header | header_option_one | 1 |
| 23 | header | header_option_three | 0 |
+----+--------------------+----------------------+----------+
| 18 | footer | footer_option_one | 0 |
+----+--------------------+----------------------+----------+
| 19 | homepage_feature | homepage_feature_one | 0 |
| 25 | homepage_feature | homepage_feature_one | 1 |
+----+--------------------+----------------------+----------+
Saya menandai grup dalam daftar di atas untuk memperjelas semuanya.
Pada langkah berikutnya, dari setiap grup, mesin basis data menghasilkan satu baris . Tapi bagaimana?
SELECT
klausa kueri Anda adalah SELECT *
. *
singkatan dari daftar lengkap kolom tabel; dalam hal ini, SELECT *
adalah cara singkat untuk menulis:
SELECT id, section_identifier, option_identifier, store_id
Mari kita analisis nilai kolom id
untuk kelompok pertama. Nilai apa yang harus dipilih oleh mesin basis data untuk id
? 17
atau 23
? Mengapa 17
dan mengapa 23
?
Itu tidak memiliki kriteria untuk mendukung 17
lebih dari 23
. Itu hanya memilih salah satu dari mereka (mungkin 17
tapi ini tergantung pada banyak faktor internal) dan salah satunya.
Tidak ada masalah untuk menentukan nilai section_identifier
. Ini adalah kolom yang digunakan untuk GROUP BY
, semua nilainya dalam grup adalah sama.
Dilema pemilihan terjadi lagi pada kolom option_identifier
dan store_id
.
Menurut SQL
standar kueri Anda tidak valid dan tidak dapat dieksekusi. Namun, beberapa mesin database menjalankannya seperti yang dijelaskan di atas. Nilai untuk ekspresi yang bukan (setidaknya salah satu di bawah ini):
- digunakan dalam
GROUP BY
klausa; - digunakan dengan
GROUP BY
fungsi agregat diSELECT
klausa; - bergantung secara fungsional pada kolom yang digunakan dalam
GROUP BY
klausa;
tidak tentu.
Sejak versi 5.7.5
, MySQL
mengimplementasikan deteksi ketergantungan fungsional
dan, secara default, menolak GROUP BY
yang tidak valid kueri seperti milik Anda.
Cara membuatnya bekerja
Tidak jelas bagi saya bagaimana Anda ingin mendapatkan hasil yang ditetapkan. Bagaimanapun, jika Anda ingin mendapatkan beberapa baris dari tabel maka GROUP BY
tidak cara yang benar untuk melakukannya. GROUP BY
tidak pilih baris dari tabel, itu menghasilkan nilai baru menggunakan nilai dari tabel. Baris yang dihasilkan oleh GROUP BY
, sering kali, tidak cocok dengan baris mana pun dari tabel sumber.
Anda dapat menemukan kemungkinan solusi untuk masalah Anda di jawaban ini . Anda harus menulis kueri sendiri setelah membaca dan memahami idenya (dan sangat jelas bagi Anda bagaimana baris "pemenang" harus dipilih).