Bagaimana cara memilih seluruh baris yang memiliki ID terbesar di tabel?


Jawaban:


228

Anda dapat menggunakan subselect:

SELECT row 
FROM table 
WHERE id=(
    SELECT max(id) FROM table
    )

Perhatikan bahwa jika nilai max(id)tidak unik, beberapa baris dikembalikan.

Jika Anda hanya menginginkan satu baris seperti itu, gunakan jawaban @ MichaelMior,

SELECT row from table ORDER BY id DESC LIMIT 1

6
@AlirezaSoori: Meskipun namanya, idhanya sebuah kolom dalam sebuah tabel. Tidak ada jaminan bahwa nilai-nilai dalam idkolom harus unik.
unutbu

1
@unutbu Dengan anggapan itu idbukan kunci primer atau unik :) Diberi nama, ada kemungkinan masuk akal. Perlu juga dicatat bahwa tergantung pada DBMS yang Anda gunakan, pendekatan dengan subselect mungkin jauh lebih efisien.
Michael Mior

3
@MichaelMior: idbisa berupa kunci asing, dalam hal ini mungkin tidak unik. Saya melakukan beberapa pembandingan menggunakan set profiling = 1; ...; show profilesdan tampaknya solusi kami memiliki kinerja yang sama menggunakan MySQL. Untuk pengetahuan saya sendiri, apakah Anda tahu DBMS memiliki kinerja yang lebih buruk untuk subselect?
unutbu

1
Itu bisa menjadi kunci asing, tetapi seperti yang saya katakan, saya hanya menebak berdasarkan nama yang bukan. MySQL secara historis dikenal memiliki kinerja yang buruk dengan subselect. Itu telah jauh meningkat di versi yang lebih baru, jadi tergantung versi apa yang Anda gunakan. Namun, jika dipikir-pikir, permintaan khusus ini mungkin OK. Meskipun menjalankan kueri beberapa kali dengan pembuatan profil tidak selalu banyak berbicara tentang kinerja relatif.
Michael Mior

149

Anda juga bisa melakukannya

SELECT row FROM table ORDER BY id DESC LIMIT 1;

Ini akan mengurutkan baris berdasarkan ID mereka dalam urutan menurun dan mengembalikan baris pertama. Ini sama dengan mengembalikan baris dengan ID maksimum. Ini tentu saja mengasumsikan ituid unik di antara semua baris. Kalau tidak, mungkin ada beberapa baris dengan nilai maksimum untuk iddan Anda hanya akan mendapatkannya.


Untuk secara spesifik melakukan apa yang diminta OP, saya akan melakukan ini. Tetapi jawaban lain memberikan pendidikan yang lebih baik tentang struktur SQL :)
MatBailie

@Dems Bagaimana? Tidak ada penjelasan yang diberikan pada jawaban lain? Saya tentu saja juga bersalah atas hal itu :(
Michael Mior

Hanya saja pertanyaan lain mengoreksi sintaksis tanpa refactoring logika. Jadi, OP belajar bagaimana menyatakan sql tertentu dengan benar.
MatBailie

Poin wajar :) Meskipun jawaban lain bisa dibilang masih mengoreksi logika.
Michael Mior

Bagaimana dengan kinerja? Saya tiba di sini dengan pertanyaan semacam ini sudah bekerja untuk saya, tetapi saya bertanya-tanya apakah itu cara yang benar. Bukankah ORDER OLEH operasi O (n * log n)?
dhill

27
SELECT * 
FROM table 
WHERE id = (SELECT MAX(id) FROM TABLE)

@ shA.t SELECT entry FROM table WHERE id = MAX(id)tidak akan berhasil ?!
oldboy

@ shA.t Juga, apa yang saya coba lakukan seperti berikut: SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email) mana saya hanya memerlukan entry_timeentri terbaru dalam database. Apakah pernyataan itu mencukupi atau seharusnya:SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
oldboy

Tidak ada makna tepercaya untuk entri terbaru dalam hasil kueri, Anda harus memiliki bidang untuk waktu penyisipan dan sebagainya. BTW, tolong ajukan pertanyaan Anda secara terpisah, saya harap Anda akan mendapatkan lebih banyak perhatian -HTH;).
shA.t

17

Anda tidak dapat memberi order bykarena order bymelakukan "pemindaian penuh" di atas meja.

Permintaan berikut ini lebih baik:

SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table);

18
ORDER BYtidak akan melakukan pemindaian penuh jika Anda menganggap itu idadalah kunci utama tabel. (Dan jika tidak, namanya agak buruk.) Jika tidak, bagaimana Anda berharap MAX(id)untuk bekerja tanpa pemindaian tabel penuh? Jika tidak ada indeks, setiap nilai masih harus diperiksa untuk menemukan maksimum.
Michael Mior

@CakeLikeBoss baik saya benar-benar mencoba "order by" query dan "SELECT * FROM Anda tabel WHERE id = (SELECT MAX (id) FROM table);" kueri di atas tabel 114 baris, sementara kueri ini mengambil tepat 0,0004 detik setiap kali, sementara kueri kedua mengambil dari 0,0007 hingga 0,0010 detik aku mengulangi ini beberapa kali
prabhjot

1

Satu selalu dapat pergi untuk fungsi analitis juga yang akan memberi Anda lebih banyak kontrol

select tmp.row from ( select row, rank() over(partition by id order by id desc ) as rnk from table) tmp where tmp.rnk=1

Jika Anda menghadapi masalah dengan fungsi rank () tergantung pada tipe data, maka seseorang dapat memilih dari row_number () atau dense_rank () juga.


0

Coba dengan ini

 SELECT top 1  id, Col2,  row_number() over (order by id desc)  FROM Table

9
Kata kunci TOP tidak berfungsi di MySQL. Kueri ini tidak akan berfungsi.
Anirudha Gupta

@toddmo: MySQL! Dan Sql-Server juga tidak membantu orang lain. Maksud Anda MS-SQL?
raiserle

@raiserle, dapatkah Anda membantu saya menemukan tempat saya berkomentar atau mengirim sesuatu pada pertanyaan ini? Saya tidak dapat melihat nama saya terlampir pada pertanyaan ini di mana saja.
toddmo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.