Pertanyaan SQL untuk memilih hanya baris dengan nilai maksimum
P粉752479467
P粉752479467 2023-08-22 10:03:28
0
2
489
<p>Saya mempunyai jadual dokumen (di sini ialah versi ringkas): </p> <table class="s-table"> <kepala> <tr> <th>id</th> <th>rev</th> <th>kandungan</th> </tr> </kepala> <tbody> <tr> <td>1</td> <td>1</td> <td>...</td> </tr> <tr> <td>2</td> <td>1</td> <td>...</td> </tr> <tr> <td>1</td> <td>2</td> <td>...</td> </tr> <tr> <td>1</td> <td>3</td> <td>...</td> </tr> </tbody> </table> <p>Bagaimana untuk memilih satu baris setiap id dan hanya memilih rev terbesar? </p><p> Berdasarkan data di atas, hasilnya harus mengandungi dua baris: <code>[1, 3, ...]</code> dan <code>[2, ​​​​1, ..]</code> ;. Saya menggunakan <strong><em>MySQL</em></strong>. </p> <p>Pada masa ini, saya menggunakan semakan dalam <kod>semasa</kod> gelung untuk mengesan dan menulis ganti rev lama dalam set hasil. Tetapi adakah ini satu-satunya cara untuk mencapai hasil? Adakah tiada penyelesaian untuk <strong>SQL</strong>? </p>
P粉752479467
P粉752479467

membalas semua(2)
P粉667649253

Saya lebih suka menggunakan kod sesedikit mungkin...

Anda boleh menggunakan IN untuk mencapai Cuba ini:

SELECT * 
FROM t1 WHERE (id,rev) IN 
( SELECT id, MAX(rev)
  FROM t1
  GROUP BY id
)

Pada pendapat saya, ini lebih mudah... lebih mudah dibaca dan diselenggara.

P粉517475670

Sepintas lalu...

Anda hanya perlukan GROUP BY子句中使用MAXfungsi pengagregatan:

SELECT id, MAX(rev)
FROM YourTable
GROUP BY id

Perkara tidak pernah semudah itu, bukan?

Saya baru perasan bahawa anda juga memerlukan content lajur.

Ini adalah masalah yang sangat biasa dalam SQL: cari data lengkap yang sepadan dengan nilai maksimum dalam lajur berdasarkan pengecam kumpulan tertentu. Saya telah banyak mendengar soalan ini dalam kerjaya saya. Malah, saya menjawab salah satu soalan ini semasa temu duga teknikal di tempat kerja saya sekarang.

Soalan ini sebenarnya sangat biasa sehingga komuniti Stack Overflow mencipta teg khusus untuk menangani soalan jenis ini: .

Pada asasnya, anda mempunyai dua cara untuk menyelesaikan masalah ini:

Sertai menggunakan group-identifier, max-value-in-groupsubquery

mudah

Dalam pendekatan ini anda mula-mula menemui group-identifier, max-value-in-group(已经在上面解决了)。然后,你将你的表与子查询进行连接,使用group-identifiermax-value-in-group dalam subkueri (sudah diselesaikan di atas). Anda kemudian sertai jadual anda dengan subkueri, menggunakan

dan max-value-in-group untuk equijoin:

SELECT a.id, a.rev, a.contents
FROM YourTable a
INNER JOIN (
    SELECT id, MAX(rev) rev
    FROM YourTable
    GROUP BY id
) b ON a.id = b.id AND a.rev = b.rev

Gunakan sambung sendiri untuk sambung kiri dan laraskan keadaan sambungan dan syarat penapisan

group-identifierDalam pendekatan ini, anda melakukan cantuman kiri jadual dengan dirinya sendiri. Equijoin pada

. Kemudian, ada dua langkah bijak:
  1. Syarat sambungan kedua ialah nilai di sebelah kiri kurang daripada nilai di sebelah kanan
  2. NULL(记住这是一个LEFT JOIN)。然后,我们过滤连接结果,只显示右侧为NULLApabila anda melakukan langkah 1, baris yang sebenarnya mempunyai nilai terbesar ialah baris dengan
  3. di sebelah kanan.

Jadi, anda akan mendapat:

SELECT a.*
FROM YourTable a
LEFT OUTER JOIN YourTable b
    ON a.id = b.id AND a.rev < b.rev
WHERE b.id IS NULL;

Kesimpulan

Hasil yang diperolehi oleh kedua-dua kaedah ini adalah sama.

group-identifiermax-value-in-groupJika anda mempunyai dua baris dengan

dan maks-nilai-dalam-kumpulan yang sama, kedua-dua kaedah akan memasukkan kedua-dua baris dalam hasil carian.

Kedua-dua kaedah adalah serasi dengan SQL ANSI, jadi tidak kira RDBMS yang anda gunakan, anda boleh menggunakan kedua-dua kaedah tanpa mengira "gaya"nya.

Kedua-dua kaedah adalah sangat cekap, tetapi keputusan khusus mungkin berbeza-beza (RDBMS, struktur pangkalan data, indeks, dll.). Jadi apabila memilih salah satu kaedah ini, lakukan penanda aras

. Dan pastikan anda memilih kaedah yang paling sesuai untuk anda. 🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!