Saya mempunyai jadual dokumen (di sini adalah versi ringkas):
id | Ubah hala | Kandungan |
---|---|---|
1 | 1 | ... |
2 | 1 | ... |
1 | 2 | ... |
1 | 3 | ... |
Bagaimana untuk memilih satu baris untuk setiap id dan hanya memilih rev terbesar?
Berdasarkan data di atas, hasilnya harus mengandungi dua baris: [1, 3, ...]
和 [2, 1, ..]
. Saya menggunakan MySQL.
Pada masa ini, saya menggunakan semak dalam while
gelung untuk mengesan dan menulis ganti rev lama dalam set hasil. Tetapi adakah ini satu-satunya cara untuk mencapai hasil? Adakah tiada penyelesaian SQL?
Saya lebih suka menggunakan kod sesedikit mungkin...
Anda boleh menggunakan
IN
untuk mencapai Cuba ini:Pada pendapat saya, ini lebih mudah... lebih mudah dibaca dan diselenggara.
Sepintas lalu...
Anda hanya perlukan
GROUP BY
子句中使用MAX
fungsi pengagregatan:Perkara tidak pernah semudah itu, bukan?
Saya baru perasan bahawa anda juga memerlukan
content
lajur.Dalam SQL, ini adalah masalah yang sangat biasa: cari seluruh baris data dengan nilai maksimum dalam lajur tertentu berdasarkan pengecam kumpulan tertentu. Saya telah banyak mendengar soalan ini dalam kerjaya saya. Sebenarnya, ini adalah soalan yang saya jawab semasa temuduga teknikal untuk pekerjaan saya sekarang.
Soalan ini sebenarnya sangat biasa sehingga komuniti Stack Overflow mencipta teg khusus untuk menangani soalan jenis ini: terhebat-n-per-kumpulan.
Pada asasnya, anda mempunyai dua cara untuk menyelesaikan masalah ini:
Sertai menggunakan
mudahgroup-identifier, max-value-in-group
subqueryDalam pendekatan ini anda mula-mula menemui
dangroup-identifier, max-value-in-group
(已经在上面解决了)。然后,你将你的表与子查询进行连接,使用group-identifier
和max-value-in-group
dalam subkueri (sudah diselesaikan di atas). Anda kemudian sertai jadual anda dengan subkueri, menggunakanmax-value-in-group
untuk equijoin:group-identifier
Dalam pendekatan ini, anda melakukan cantuman kiri jadual dengan dirinya sendiri. Equijoins diletakkan diNULL
(记住这是一个LEFT JOIN
)。然后,我们过滤连接的结果,只显示右侧为NULL
Apabila anda melakukan langkah 1, baris yang sebenarnya mempunyai nilai terbesar ialah baris dengangroup-identifier
中有两行具有max-value-in-group
Jika terdapat dua baris denganKedua-dua kaedah juga mesra prestasi, tetapi situasi sebenar anda mungkin berbeza (RDBMS, struktur pangkalan data, indeks, dll.). Jadi apabila memilih kaedah, lakukan penanda aras
. Pastikan anda memilih kaedah yang paling sesuai untuk anda. 🎜