Gunakan order by 1hanya saat duduk saat mysql> diminta. Dalam kode, gunakan ORDER BY id ASC. Catat kasus, nama bidang eksplisit, dan arah pemesanan eksplisit.
dotancohen
Jawaban:
28
Ini sebenarnya hal yang sangat buruk untuk dilakukan IMHO, dan tidak didukung di sebagian besar platform basis data lainnya.
Alasan orang melakukannya:
mereka malas - saya tidak tahu mengapa orang berpikir produktivitas mereka ditingkatkan dengan menulis kode singkat daripada mengetik untuk tambahan 40 milidetik untuk mendapatkan kode yang lebih literal.
Alasannya buruk:
ini tidak mendokumentasikan diri sendiri - seseorang harus menguraikan daftar SELECT untuk mengetahui pengelompokan. Sebenarnya akan sedikit lebih jelas dalam SQL Server, yang tidak mendukung pengelompokan koboi yang tahu apa yang akan terjadi seperti yang dilakukan MySQL.
rapuh - seseorang masuk dan mengubah daftar SELECT karena pengguna bisnis menginginkan output laporan yang berbeda, dan sekarang output Anda berantakan. Jika Anda menggunakan nama kolom dalam GROUP BY, pesanan dalam daftar SELECT tidak akan relevan.
SQL Server mendukung ORDER OLEH [ordinal]; berikut adalah beberapa argumen paralel yang menentang penggunaannya:
Beberapa ada column numberdalam diagram SQL . Satu baris mengatakan: Urutkan hasilnya dengan nomor kolom yang diberikan, atau dengan ekspresi. Jika ekspresi adalah parameter tunggal, maka nilainya ditafsirkan sebagai nomor kolom. Nomor kolom negatif membalik urutan.
Google memiliki banyak contoh penggunaannya dan mengapa banyak yang berhenti menggunakannya.
Jujur dengan Anda, saya belum pernah menggunakan nomor kolom untuk ORDER BYdan GROUP BYsejak tahun 1996 (saya melakukan Oracle PL / SQL Development pada saat itu). Menggunakan nomor kolom adalah benar-benar untuk orang-orang tua dan kompatibilitas mundur memungkinkan pengembang untuk menggunakan MySQL dan RDBMS lainnya yang masih memungkinkan untuk itu.
Anda harus mengetahui jumlah unduhan per layanan per hari dengan mempertimbangkan Aplikasi dan Aplikasi sebagai layanan yang sama. Pengelompokan menurut date, servicesakan menghasilkan Appsdan Applicationsdianggap layanan terpisah.
Jika demikian, kueri akan:
select date, services, sum(downloads)as downloads
from test.zvijay_test
groupby date,services
Tapi ini bukan yang Anda inginkan karena Aplikasi dan Aplikasi yang akan dikelompokkan adalah persyaratan. Jadi apa yang bisa kita lakukan?
Salah satu caranya adalah menggantinya Appsdengan Applicationsmenggunakan CASEekspresi atau IFfungsi dan kemudian mengelompokkannya di atas layanan sebagai:
select
date,if(services='Apps','Applications',services)as services,
sum(downloads)as downloads
from test.zvijay_test
groupby date,services
Tetapi ini masih mengelompokkan layanan mempertimbangkan Appsdan Applicationssebagai layanan yang berbeda dan memberikan output yang sama seperti sebelumnya:
Saya telah membaca berkali-kali bahwa ini adalah cara malas menulis kueri atau pengelompokan pada kolom alias tidak berfungsi di MySQL, tetapi ini adalah cara pengelompokan atas kolom alias.
Ini bukan cara yang disukai untuk menulis kueri, gunakan hanya ketika Anda benar-benar perlu mengelompokkan lebih dari satu kolom alias.
" Tetapi ini masih mengelompokkan layanan yang mempertimbangkan Aplikasi dan Aplikasi sebagai layanan yang berbeda dan memberikan hasil yang sama seperti sebelumnya ". Tidakkah ini akan diselesaikan jika Anda telah memilih nama yang berbeda (tidak bertentangan) untuk alias?
Daddy32
3
Tidak ada alasan yang sah untuk menggunakannya. Ini hanyalah jalan pintas malas yang dirancang khusus untuk menyulitkan pengembang yang sulit untuk mengetahui pengelompokan atau pengurutan Anda nanti atau untuk memungkinkan kode gagal total ketika seseorang mengubah urutan kolom. Pertimbangkan sesama pengembang dan jangan lakukan itu.
SELECT dep_month,dep_day_of_week,dep_date,COUNT(*)AS flight_count FROM flights GROUPBY1,2;SELECT dep_month,dep_day_of_week,dep_date,COUNT(*)AS flight_count FROM flights GROUPBY1,2,3;
Pertimbangkan pertanyaan di atas: Kelompokkan dengan 1 berarti mengelompokkan menurut kolom pertama dan grup dengan 1,2 berarti mengelompokkan dengan kolom pertama dan kedua dan grup dengan 1,2,3 berarti mengelompokkan dengan kolom kedua dan ketiga pertama. Untuk misalnya:
gambar ini menunjukkan dua kolom pertama yang dikelompokkan oleh 1,2 yaitu, tidak mempertimbangkan nilai yang berbeda dari dep_date untuk menemukan hitungan (untuk menghitung jumlah semua kombinasi yang berbeda dari dua kolom pertama dipertimbangkan) sedangkan permintaan kedua menghasilkan ini
gambar. Di sini ia mempertimbangkan semua tiga kolom pertama dan ada nilai yang berbeda untuk menemukan penghitungan yaitu, itu adalah pengelompokan oleh semua tiga kolom pertama (untuk menghitung jumlah semua kombinasi yang berbeda dari tiga kolom pertama dipertimbangkan).
order by 1
hanya saat duduk saatmysql>
diminta. Dalam kode, gunakanORDER BY id ASC
. Catat kasus, nama bidang eksplisit, dan arah pemesanan eksplisit.Jawaban:
Ini sebenarnya hal yang sangat buruk untuk dilakukan IMHO, dan tidak didukung di sebagian besar platform basis data lainnya.
Alasan orang melakukannya:
Alasannya buruk:
ini tidak mendokumentasikan diri sendiri - seseorang harus menguraikan daftar SELECT untuk mengetahui pengelompokan. Sebenarnya akan sedikit lebih jelas dalam SQL Server, yang tidak mendukung pengelompokan koboi yang tahu apa yang akan terjadi seperti yang dilakukan MySQL.
rapuh - seseorang masuk dan mengubah daftar SELECT karena pengguna bisnis menginginkan output laporan yang berbeda, dan sekarang output Anda berantakan. Jika Anda menggunakan nama kolom dalam GROUP BY, pesanan dalam daftar SELECT tidak akan relevan.
SQL Server mendukung ORDER OLEH [ordinal]; berikut adalah beberapa argumen paralel yang menentang penggunaannya:
sumber
MySQL memungkinkan Anda untuk melakukan
GROUP BY
alias ( Masalah dengan Kolom Alias ). Ini akan jauh lebih baik dibandingkanGROUP BY
dengan angka.column number
dalam diagram SQL . Satu baris mengatakan: Urutkan hasilnya dengan nomor kolom yang diberikan, atau dengan ekspresi. Jika ekspresi adalah parameter tunggal, maka nilainya ditafsirkan sebagai nomor kolom. Nomor kolom negatif membalik urutan.Google memiliki banyak contoh penggunaannya dan mengapa banyak yang berhenti menggunakannya.
Jujur dengan Anda, saya belum pernah menggunakan nomor kolom untuk
ORDER BY
danGROUP BY
sejak tahun 1996 (saya melakukan Oracle PL / SQL Development pada saat itu). Menggunakan nomor kolom adalah benar-benar untuk orang-orang tua dan kompatibilitas mundur memungkinkan pengembang untuk menggunakan MySQL dan RDBMS lainnya yang masih memungkinkan untuk itu.sumber
Pertimbangkan kasus di bawah ini:
Anda harus mengetahui jumlah unduhan per layanan per hari dengan mempertimbangkan Aplikasi dan Aplikasi sebagai layanan yang sama. Pengelompokan menurut
date, services
akan menghasilkanApps
danApplications
dianggap layanan terpisah.Jika demikian, kueri akan:
Dan Output:
Tapi ini bukan yang Anda inginkan karena Aplikasi dan Aplikasi yang akan dikelompokkan adalah persyaratan. Jadi apa yang bisa kita lakukan?
Salah satu caranya adalah menggantinya
Apps
denganApplications
menggunakanCASE
ekspresi atauIF
fungsi dan kemudian mengelompokkannya di atas layanan sebagai:Tetapi ini masih mengelompokkan layanan mempertimbangkan
Apps
danApplications
sebagai layanan yang berbeda dan memberikan output yang sama seperti sebelumnya:Pengelompokan pada nomor kolom memungkinkan Anda untuk mengelompokkan data pada kolom alias.
Dan dengan demikian memberi Anda output yang diinginkan seperti di bawah ini:
Saya telah membaca berkali-kali bahwa ini adalah cara malas menulis kueri atau pengelompokan pada kolom alias tidak berfungsi di MySQL, tetapi ini adalah cara pengelompokan atas kolom alias.
Ini bukan cara yang disukai untuk menulis kueri, gunakan hanya ketika Anda benar-benar perlu mengelompokkan lebih dari satu kolom alias.
sumber
Tidak ada alasan yang sah untuk menggunakannya. Ini hanyalah jalan pintas malas yang dirancang khusus untuk menyulitkan pengembang yang sulit untuk mengetahui pengelompokan atau pengurutan Anda nanti atau untuk memungkinkan kode gagal total ketika seseorang mengubah urutan kolom. Pertimbangkan sesama pengembang dan jangan lakukan itu.
sumber
Ini berhasil untuk saya. Kode mengelompokkan baris hingga 5 grup.
Hasilnya adalah sebagai berikut
sumber
Pertimbangkan pertanyaan di atas: Kelompokkan dengan 1 berarti mengelompokkan menurut kolom pertama dan grup dengan 1,2 berarti mengelompokkan dengan kolom pertama dan kedua dan grup dengan 1,2,3 berarti mengelompokkan dengan kolom kedua dan ketiga pertama. Untuk misalnya:
gambar ini menunjukkan dua kolom pertama yang dikelompokkan oleh 1,2 yaitu, tidak mempertimbangkan nilai yang berbeda dari dep_date untuk menemukan hitungan (untuk menghitung jumlah semua kombinasi yang berbeda dari dua kolom pertama dipertimbangkan) sedangkan permintaan kedua menghasilkan ini
gambar. Di sini ia mempertimbangkan semua tiga kolom pertama dan ada nilai yang berbeda untuk menemukan penghitungan yaitu, itu adalah pengelompokan oleh semua tiga kolom pertama (untuk menghitung jumlah semua kombinasi yang berbeda dari tiga kolom pertama dipertimbangkan).
sumber