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

Setara dengan PostgreSQL untuk MySQL GROUP BY

Back-ticks adalah hal MySQL non-standar. Gunakan tanda kutip ganda kanonik untuk mengutip pengidentifikasi (mungkin juga di MySQL). Artinya, jika tabel Anda sebenarnya bernama "MY_TABLE" (semua huruf besar). Jika Anda (lebih bijak) menamakannya my_table (semua huruf kecil), maka Anda dapat menghapus tanda kutip ganda atau menggunakan huruf kecil.

Juga, saya menggunakan ct bukannya count sebagai alias, karena menggunakan nama fungsi sebagai pengidentifikasi adalah praktik yang buruk.

Kasus sederhana

Ini akan bekerja dengan PostgreSQL 9.1 :

SELECT *, count(id) ct
FROM   my_table
GROUP  BY primary_key_column(s)
ORDER  BY ct DESC;

Ini membutuhkan kolom kunci utama di GROUP BY ayat. Hasilnya identik ke kueri MySQL, tetapi ct akan selalu 1 (atau 0 jika id IS NULL ) - tidak berguna untuk menemukan duplikat.

Kelompokkan menurut selain kolom kunci utama

Jika Anda ingin mengelompokkan berdasarkan kolom lain, semuanya menjadi lebih rumit. Kueri ini meniru perilaku kueri MySQL Anda - dan Anda bisa gunakan * .

SELECT DISTINCT ON (1, some_column)
       count(*) OVER (PARTITION BY some_column) AS ct
      ,*
FROM   my_table
ORDER  BY 1 DESC, some_column, id, col1;

Ini berfungsi karena DISTINCT ON (khusus PostgreSQL), seperti DISTINCT (SQL-Standar), diterapkan setelah fungsi jendela count(*) OVER (...) . Fungsi jendela (dengan OVER klausa) memerlukan PostgreSQL 8.4 atau lebih baru dan tidak tersedia di MySQL.

Bekerja dengan tabel apa pun, terlepas dari batasan utama atau unik.

1 di DISTINCT ON dan ORDER BY hanyalah singkatan untuk merujuk ke nomor urut item di SELECT daftar.

SQL Fiddle untuk mendemonstrasikan keduanya secara berdampingan.

Detail lebih lanjut dalam jawaban yang terkait erat ini:

count(*) vs. count(id)

Jika Anda mencari duplikat, Anda lebih baik menggunakan count(*) dibandingkan dengan count(id) . Ada sedikit perbedaan jika id bisa NULL , karena NULL nilai tidak dihitung - sementara count(*) menghitung semua baris. Jika id didefinisikan NOT NULL , hasilnya sama, tapi count(*) umumnya lebih tepat (dan sedikit lebih cepat juga).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Codeigniter `where` dan `or_where`

  2. Bagaimana cara mengatur innodb_buffer_pool_size global?

  3. MySQL ERROR 1005 (HY000):Tidak dapat membuat tabel 'foo.#sql-12c_4' (errno:150)

  4. SQL Error 1630:Fungsi SUBSTRING tidak ada.. ya?

  5. PHP/MySQL - Menyimpan data array sebagai JSON, praktik buruk?