Tentukan "baris terakhir". Yang dengan ID tertinggi? Atau yang terakhir ditambahkan?
EboMike
1
Apa yang mengindikasikan baris terakhir - Apakah ada kolom auto_increment atau DATETIME dalam tabel?
OMG Ponies
Ya, ada auto_incrementdi sana. Saya ingin yang terakhir ditambahkan.
esqew
9
Tidak ada baris terakhir dalam satu set, seperti yang dikatakan EboMike dan OMG Ponies. Apa yang akan Anda lakukan jika saya memberi Anda tas penuh bola dan meminta Anda memberi saya bola terakhir?
Vincent Savard
Jawaban:
402
Ya, ada auto_increment di sana
Jika Anda ingin yang terakhir dari semua baris dalam tabel, maka ini akhirnya waktu di mana MAX(id)jawaban yang tepat! Agak:
Saya khawatir ini akan lambat jika perlu mengurutkan jutaan baris, bukan?
Slawa
2
Saya hanya menjalankan ini lebih dari 20m baris dan itu sangat cepat. Saya berasumsi ada semacam kasus khusus untuk menangani permintaan ini. (EDIT: MySQL 5.7, mesin InnoDB)
Daniel Buckmaster
1
@ Pekka: Saya tidak ingin menggunakan pesanan, apakah ada opsi lain untuk melakukannya?
shiva
4
@ Slawa Tidak jika iddiindeks.
Marquis of Lorne
31
Perlu diingat bahwa tabel dalam basis data relasional hanyalah kumpulan baris. Dan set dalam matematika adalah koleksi yang tidak teratur. Tidak ada baris pertama atau terakhir; tidak ada baris sebelumnya atau baris berikutnya.
Anda harus mengurutkan set baris tidak berurut menurut beberapa bidang terlebih dahulu, dan kemudian Anda membebaskan iterate melalui resultset dalam urutan yang Anda tentukan.
Karena Anda memiliki bidang penambahan otomatis, saya berasumsi Anda ingin itu menjadi bidang pengurutan. Dalam hal ini, Anda mungkin ingin melakukan hal berikut:
Lihat bagaimana kami pertama-tama menyortir kumpulan baris yang tidak berurut menurut your_auto_increment_field(atau apa pun namanya) dengan urutan menurun. Kemudian kita batasi resultset hanya untuk baris pertama LIMIT 1.
@karthikeyan menulis jawabannya empat hari yang lalu dan saya menjawabnya pada Desember 2015.
vzr
tidak, saya mengedit dan mengoreksi beberapa ejaan 4 hari yang lalu ... tanggal posting adalah 2014 itu answered Jun 14 at 9:41sekitar 1 tahun dan 6 bulan sebelumnya :)
Dwza
Hanya untuk membersihkan udara di sini, vzr benar. 'Jun 14' berarti 14 Jun 2016 juga @karthikeyan hanya menjadi anggota selama dua bulan pada saat ini.
Robert Brisita
Ssooo ... @ jawaban karthikeyan adalah salinan dari yang ini!
Cliff Burton
24
pada tabel dengan banyak baris adalah dua pertanyaan mungkin lebih cepat ...
SELECT@last_id := MAX(id)FROMtable;SELECT*FROMtableWHERE id =@last_id;
Baik. Sebagian besar pustaka antarmuka MySQL yang layak memiliki metode khusus untuk ini, namun pertanyaan ini tidak ditandai PHP tetapi sintaksis MySQL umum.
vzr
4
Jika Anda ingin yang terakhir ditambahkan, tambahkan cap waktu dan pilih dipesan dalam urutan terbalik dengan cap waktu tertinggi, batas 1. Jika Anda ingin menggunakan ID, urutkan berdasarkan ID. Jika Anda ingin menggunakan yang Anda HANYA ditambahkan, gunakan mysql_insert_id.
Banyak jawaban di sini mengatakan hal yang sama (urutan kenaikan otomatis Anda), yang OK, asalkan Anda memiliki kolom peningkatan otomatis yang diindeks.
Di samping catatan, jika Anda memiliki bidang dan itu adalah kunci utama, tidak ada penalti kinerja untuk menggunakan order byversus select max(id). Kunci utama adalah bagaimana data disusun dalam file database (setidaknya untuk InnoDB), dan RDBMS tahu di mana data itu berakhir, dan itu dapat mengoptimalkanorder by id + limit 1 untuk menjadi sama dengan mencapaimax(id)
Sekarang jalan yang jarang dilalui adalah ketika Anda tidak memiliki kunci primer yang ditingkatkan otomatis. Mungkin kunci primer adalah kunci alami, yang merupakan gabungan dari 3 bidang ... Namun tidak semua hilang. Dari bahasa pemrograman Anda bisa mendapatkan jumlah baris terlebih dahulu
SELECT Count(*)-1ASrowcountFROM<yourTable>;
dan kemudian gunakan nomor yang diperoleh di LIMIT klausa
auto_increment
di sana. Saya ingin yang terakhir ditambahkan.Jawaban:
Jika Anda ingin yang terakhir dari semua baris dalam tabel, maka ini akhirnya waktu di mana
MAX(id)
jawaban yang tepat! Agak:sumber
id
diindeks.Perlu diingat bahwa tabel dalam basis data relasional hanyalah kumpulan baris. Dan set dalam matematika adalah koleksi yang tidak teratur. Tidak ada baris pertama atau terakhir; tidak ada baris sebelumnya atau baris berikutnya.
Anda harus mengurutkan set baris tidak berurut menurut beberapa bidang terlebih dahulu, dan kemudian Anda membebaskan iterate melalui resultset dalam urutan yang Anda tentukan.
Karena Anda memiliki bidang penambahan otomatis, saya berasumsi Anda ingin itu menjadi bidang pengurutan. Dalam hal ini, Anda mungkin ingin melakukan hal berikut:
Lihat bagaimana kami pertama-tama menyortir kumpulan baris yang tidak berurut menurut
your_auto_increment_field
(atau apa pun namanya) dengan urutan menurun. Kemudian kita batasi resultset hanya untuk baris pertamaLIMIT 1
.sumber
Anda dapat menggabungkan dua pertanyaan yang disarankan oleh @spacepille menjadi satu permintaan yang terlihat seperti ini:
Ini seharusnya bekerja sangat cepat, tetapi pada tabel INNODB fraksi milidetik lebih lambat dari ORDER + LIMIT.
sumber
answered Jun 14 at 9:41
sekitar 1 tahun dan 6 bulan sebelumnya :)pada tabel dengan banyak baris adalah dua pertanyaan mungkin lebih cepat ...
sumber
Gunakan saja:
PDO::lastInsertId
http://php.net/manual/en/pdo.lastinsertid.php
sumber
Jika Anda ingin yang terakhir ditambahkan, tambahkan cap waktu dan pilih dipesan dalam urutan terbalik dengan cap waktu tertinggi, batas 1. Jika Anda ingin menggunakan ID, urutkan berdasarkan ID. Jika Anda ingin menggunakan yang Anda HANYA ditambahkan, gunakan
mysql_insert_id
.sumber
Hampir setiap tabel database, ada kolom auto_increment (umumnya id)
Jika Anda ingin yang terakhir dari semua baris dalam tabel,
ATAU
Anda dapat menggabungkan dua kueri menjadi satu kueri yang terlihat seperti ini:
sumber
Kueri ini digunakan untuk mengambil catatan terakhir di tabel Anda.
sumber
Banyak jawaban di sini mengatakan hal yang sama (urutan kenaikan otomatis Anda), yang OK, asalkan Anda memiliki kolom peningkatan otomatis yang diindeks.
Di samping catatan, jika Anda memiliki bidang dan itu adalah kunci utama, tidak ada penalti kinerja untuk menggunakan
order by
versusselect max(id)
. Kunci utama adalah bagaimana data disusun dalam file database (setidaknya untuk InnoDB), dan RDBMS tahu di mana data itu berakhir, dan itu dapat mengoptimalkanorder by id + limit 1
untuk menjadi sama dengan mencapaimax(id)
Sekarang jalan yang jarang dilalui adalah ketika Anda tidak memiliki kunci primer yang ditingkatkan otomatis. Mungkin kunci primer adalah kunci alami, yang merupakan gabungan dari 3 bidang ... Namun tidak semua hilang. Dari bahasa pemrograman Anda bisa mendapatkan jumlah baris terlebih dahulu
dan kemudian gunakan nomor yang diperoleh di
LIMIT
klausaSayangnya, MySQL tidak akan mengizinkan sub-kueri, atau variabel pengguna dalam
LIMIT
klausasumber
Anda dapat menggunakan
OFFSET
dalamLIMIT
perintah:jika meja Anda memiliki 100 baris, kembalikan baris terakhir ini tanpa mengandalkan primary_key
sumber