Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana GROUP BY DESC memilih urutannya?

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 di SELECT 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).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. File kunci salah untuk tabel '/tmp/#sql_3c51_0.MYI' coba perbaiki

  2. Peringatan:mysql_fetch_array() mengharapkan parameter 1 menjadi sumber daya, boolean diberikan dalam

  3. Laravel 5 PDOException Tidak Dapat Menemukan Driver

  4. cara membangun aplikasi php mysql yang bekerja offline

  5. Kembalikan Hanya Nilai Numerik di MySQL