@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
SELECTrowFROMtableORDERBY 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*FROMtableWHERE id =(SELECT MAX(id)FROMTABLE)
@ 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*FROMtableWHERE id =(SELECT MAX(id)FROMtable);
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.
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.
Jawaban:
Anda dapat menggunakan subselect:
Perhatikan bahwa jika nilai
max(id)
tidak unik, beberapa baris dikembalikan.Jika Anda hanya menginginkan satu baris seperti itu, gunakan jawaban @ MichaelMior,
sumber
id
hanya sebuah kolom dalam sebuah tabel. Tidak ada jaminan bahwa nilai-nilai dalamid
kolom harus unik.id
bukan 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.id
bisa berupa kunci asing, dalam hal ini mungkin tidak unik. Saya melakukan beberapa pembandingan menggunakanset profiling = 1; ...; show profiles
dan tampaknya solusi kami memiliki kinerja yang sama menggunakan MySQL. Untuk pengetahuan saya sendiri, apakah Anda tahu DBMS memiliki kinerja yang lebih buruk untuk subselect?Anda juga bisa melakukannya
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 itu
id
unik di antara semua baris. Kalau tidak, mungkin ada beberapa baris dengan nilai maksimum untukid
dan Anda hanya akan mendapatkannya.sumber
sumber
SELECT entry FROM table WHERE id = MAX(id)
tidak akan berhasil ?!SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email)
mana saya hanya memerlukanentry_time
entri 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
Anda tidak dapat memberi
order by
karenaorder by
melakukan "pemindaian penuh" di atas meja.Permintaan berikut ini lebih baik:
sumber
ORDER BY
tidak akan melakukan pemindaian penuh jika Anda menganggap ituid
adalah kunci utama tabel. (Dan jika tidak, namanya agak buruk.) Jika tidak, bagaimana Anda berharapMAX(id)
untuk bekerja tanpa pemindaian tabel penuh? Jika tidak ada indeks, setiap nilai masih harus diperiksa untuk menemukan maksimum.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.
sumber
Coba dengan ini
sumber