ID FirstName LastName
1 John Doe
2 Bugs Bunny
3 John Johnson
Saya ingin memilih DISTINCT
hasil dari FirstName
kolom, tetapi saya perlu yang sesuai ID
dan LastName
.
Set hasil harus menunjukkan hanya satu John
, tetapi dengan angka ID
1 dan LastName
Doe.
DISTINCT
bukan fungsi. Semua jawabanDISTINCT()
salah. Kesalahan akan muncul ketika Anda tidak menempatkannya setelahnyaSELECT
.ALL
jawaban menggunakan tanda kurung setelah kata berbeda memang salah. Perbedaan BUKAN fungsi sehingga tidak dapat menerima parameter. Tanda kurung berikut berbeda hanya diabaikan. Kecuali jika Anda menggunakan PostgreSQL tempat tanda kurung akan membentuk "tipe data kompleks"Jawaban:
coba kueri ini
sumber
5.7.5+
untukGROUP BY
penanganan yangKata
DISTINCT
kunci tidak benar-benar berfungsi seperti yang Anda harapkan. Ketika Anda menggunakanSELECT DISTINCT col1, col2, col3
Anda sebenarnya memilih semua tupel {col1, col2, col3} yang unik.sumber
Untuk menghindari kemungkinan hasil yang tidak terduga ketika menggunakan
GROUP BY
tanpa fungsi agregat, seperti yang digunakan dalam jawaban yang diterima , karena MySQL bebas untuk mengambil nilai APAPUN dalam kumpulan data yang dikelompokkan ketika tidak menggunakan fungsi agregat [sic] dan masalah denganONLY_FULL_GROUP_BY
. Harap pertimbangkan untuk menggunakan gabungan pengecualian.Pengecualian Bergabung - Entitas yang Tidak Mendua
Dengan asumsi nama depan dan nama belakang diindeks secara unik (tidak ambigu) , alternatifnya
GROUP BY
adalah menyortir menggunakanLEFT JOIN
untuk menyaring set hasil, atau dikenal sebagai pengecualian. GABUNG.Lihat Demonstrasi
Pesanan naik (AZ)
Untuk mengambil nama depan berbeda yang dipesan oleh nama belakang dari AZ
Pertanyaan
Hasil
Urutan menurun (ZA)
Untuk mengambil nama depan berbeda yang dipesan oleh nama belakang dari ZA
Pertanyaan
Hasil
Anda kemudian dapat memesan data yang dihasilkan sesuai keinginan.
Pengecualian Bergabung - Entitas Mendua
Jika kombinasi nama depan dan belakang tidak unik (ambigu) dan Anda memiliki beberapa baris dengan nilai yang sama, Anda dapat memfilter hasil yang ditetapkan dengan menyertakan kondisi ATAU pada kriteria GABUNG untuk juga memfilter menurut id.
Lihat Demonstrasi
data table_name
Pertanyaan
Hasil
Subquery Dipesan
EDIT
Jawaban asli saya menggunakan subquery yang dipesan , ditulis sebelum MySQL 5.7.5 , yang tidak lagi berlaku, karena perubahan dengan
ONLY_FULL_GROUP_BY
. Silakan gunakan pengecualian gabungan contoh di atas saja.Penting juga untuk dicatat; ketika
ONLY_FULL_GROUP_BY
dinonaktifkan (perilaku asli sebelum MySQL 5.7.5) , penggunaanGROUP BY
tanpa fungsi agregat dapat menghasilkan hasil yang tidak terduga, karena MySQL bebas untuk memilih nilai APAPUN dalam kumpulan data yang dikelompokkan [sic] .Berarti suatu
ID
ataulastname
nilai dapat diambil yang tidak terkait denganfirstname
baris yang diambil .PERINGATAN
Dengan MySQL
GROUP BY
mungkin tidak menghasilkan hasil yang diharapkan saat digunakan bersamaORDER BY
Lihat Contoh Test Case
Metode implementasi terbaik, untuk memastikan hasil yang diharapkan, adalah dengan memfilter lingkup pengaturan hasil menggunakan subquery yang dipesan.
data table_name
Pertanyaan
Hasil
Perbandingan
Untuk menunjukkan hasil yang tidak terduga saat menggunakan
GROUP BY
dalam kombinasi denganORDER BY
Pertanyaan
Hasil
sumber
Ordering is done after grouping.
, jadi Tidak tidak dalam kasus penggunaan ini, selain itu MariaDB mengabaikan ORDER BY dalam subqueries (sesuai standar SQL) tanpa aLIMIT
. Anda akan ingin menggunakanWindow Function
Untuk klarifikasi lebih Anda harus menanyakan pertanyaan Anda di stackexchange DBA , karena ini adalah pertanyaan yang berhubungan dengan MySQLGROUP BY
dapat memilih nilai apa pun dalam kumpulan data yang dikelompokkan, kecuali fungsi agregat digunakan pada kolom tersebut untuk memaksa nilai tertentu. Jadilastname
atauid
bisa datang dari salah satu baris yang dipesan. Contoh subquery asli dapat diterima secara default diMySQL <= 5.7.4
tetapi secara teknis masih menderita masalah. MeskipunORDER BY
tidak membantu untuk mencegah pemilihan acak, itu masih mungkin secara teoritis, tetapi dengan probabilitas jauh lebih kecil daripada tanpa menggunakanORDER BY
subquery.sumber
HAVING
membuat permintaan saya 50% lebih lambat.sumber
Bagaimana tentang
sumber
Tidak yakin apakah Anda dapat melakukan ini dengan MySQL, tetapi Anda dapat menggunakan CTE di T-SQL
Kalau tidak, Anda mungkin harus menggunakan tabel sementara.
sumber
Seperti yang ditunjukkan oleh fyrye , jawaban yang diterima berkaitan dengan versi MySQL yang lebih lama yang
ONLY_FULL_GROUP_BY
belum diperkenalkan. Dengan MySQL 8.0.17 (digunakan dalam contoh ini), kecuali jika Anda menonaktifkanONLY_FULL_GROUP_BY
Anda akan mendapatkan pesan kesalahan berikut:Salah satu cara untuk mengatasi ini tidak disebutkan oleh fyrye , tetapi dijelaskan dalam https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html , adalah menerapkan
ANY_VALUE()
fungsi ke kolom yang tidak ada dalamGROUP BY
klausa (id
danlastName
dalam contoh ini):Seperti yang tertulis dalam dokumen tersebut di atas,
sumber
ANY_VALUE()
karena jawaban dan komentar saya difokuskan untuk mencegah hasil-hasil yang ambigu dan tidak dapat diprediksi. Karena seperti nama fungsi menyarankan, itu bisa menghasilkan nilai dari baris yang dipilih diambil. Saya sarankan menggunakanMAX
atauMIN
sebagai gantinya.Perlu diingat ketika menggunakan grup berdasarkan dan dipesan dengan itu MySQL adalah database HANYA yang memungkinkan kolom untuk digunakan dalam grup oleh dan / atau urutan demi bagian yang bukan bagian dari pernyataan pilih.
Jadi misalnya: pilih kolom1 dari grup tabel dengan urutan kolom2 oleh kolom3
Itu tidak akan terbang di database lain seperti Postgres, Oracle, MSSQL, dll. Anda harus melakukan yang berikut dalam database tersebut
pilih kolom1, kolom2, kolom3 dari grup tabel dengan urutan kolom2 oleh kolom3
Hanya beberapa info jika Anda pernah memigrasi kode Anda saat ini ke database lain atau mulai bekerja di database lain dan mencoba untuk menggunakan kembali kode.
sumber
Anda dapat menggunakan grup dengan untuk menampilkan nilai yang berbeda dan juga bidang yang sesuai.
Sekarang Anda mendapatkan output seperti ini:
Jika Anda ingin menjawab suka
lalu gunakan kueri ini,
sumber
Akan menjadi IMO taruhan terbaik
sumber
sumber
DISTINCT()
bukan fungsi. Juga berbeda dan GROUP BY melakukan hal yang sama, jadi tidak ada alasan untuk menempatkan keduanya.