Pilih baris terakhir di MySQL

181

Bagaimana saya bisa SELECTbaris terakhir dalam tabel MySQL?

Saya sedang INSERTmemasukkan data dan saya perlu mengambil nilai kolom dari baris sebelumnya.

Ada auto_incrementdi dalam meja.

esqew
sumber
8
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:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;
Pekka
sumber
12
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:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

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.

Daniel Vassallo
sumber
25

Anda dapat menggabungkan dua pertanyaan yang disarankan oleh @spacepille menjadi satu permintaan yang terlihat seperti ini:

SELECT * FROM `table_name` WHERE id=(SELECT MAX(id) FROM `table_name`);

Ini seharusnya bekerja sangat cepat, tetapi pada tabel INNODB fraksi milidetik lebih lambat dari ORDER + LIMIT.

ay
sumber
@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) FROM table;

SELECT * FROM table WHERE id = @last_id;
spacepille
sumber
6

Gunakan saja: PDO::lastInsertId

http://php.net/manual/en/pdo.lastinsertid.php

macio.Jun
sumber
2
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.

EboMike
sumber
4

Hampir setiap tabel database, ada kolom auto_increment (umumnya id)

Jika Anda ingin yang terakhir dari semua baris dalam tabel,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

ATAU

Anda dapat menggabungkan dua kueri menjadi satu kueri yang terlihat seperti ini:

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);
Sani Kamal
sumber
kenaikan otomatis hanya ada jika DBA (atau siapa pun yang membuat tabel) menerapkan kenaikan otomatis
WhatsThePoint
2
SELECT * FROM adds where id=(select max(id) from adds);

Kueri ini digunakan untuk mengambil catatan terakhir di tabel Anda.

karthikeyan
sumber
Salinan jawaban di bawah ini
Jbur43
2

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(*) - 1 AS rowcount FROM <yourTable>;

dan kemudian gunakan nomor yang diperoleh di LIMIT klausa

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

Sayangnya, MySQL tidak akan mengizinkan sub-kueri, atau variabel pengguna dalam LIMITklausa

Ilia Gilmijarow
sumber
1

Anda dapat menggunakan OFFSETdalam LIMITperintah:

SELECT * FROM aTable LIMIT 1 OFFSET 99

jika meja Anda memiliki 100 baris, kembalikan baris terakhir ini tanpa mengandalkan primary_key

Benvorth
sumber