MySQL'de son satırı seç


182

SELECTBir MySQL tablosundaki son satırı nasıl alabilirim ?

Ben INSERTveri ing ve önceki satırdan bir sütun değeri almanız gerekiyor.

Bir var auto_incrementtabloda.


8
"Son satır" ı tanımlayın. En yüksek kimliğe sahip olan? Veya en son eklenen?
EboMike

1
Son satırı ne gösterir - Tabloda bir auto_increment veya DATETIME sütunu var mı?
OMG Ponies

Evet, orada bir tane auto_incrementvar. En son eklenenleri istiyorum.
esqew

9
EboMike ve OMG Ponies'in dediği gibi bir sette son sıra yok. Sana toplarla dolu bir çanta verir ve son topu vermeni istersem ne yapardın?
Vincent Savard

Yanıtlar:


402

Evet, orada bir otomatik_arama var

Tablodaki tüm satırların sonunu istiyorsanız , o zaman bu nihayet MAX(id)doğru cevap zamanı ! Türü:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;

12
Korkarım milyon sıra sıralaması gerekiyorsa yavaşlıyor, değil mi?
Slawa

2
Ben sadece 20m satırlar üzerinde koştu ve çok hızlı oldu. Bu sorguyu işlemek için özel bir durum olduğunu varsayalım. (DÜZENLEME: MySQL 5.7, InnoDB motoru)
Daniel Buckmaster

1
@Pekka: Siparişi kullanmak istemiyorum, bunu yapmak için başka bir seçenek var mı?
shiva

4
@Slawa idDizine eklenmişse değil .
Lorne Marquis

31

İlişkisel veritabanlarındaki tabloların yalnızca satır kümesi olduğunu unutmayın. Ve matematikteki kümeler sıralanmamış koleksiyonlardır. İlk veya son satır yok; önceki satır veya sonraki satır yok.

Sırasız satır kümenizi önce bir alana göre sıralamanız gerekir ve ardından yinelemeyi sonuç kümesinde tanımladığınız sırayla serbest bırakırsınız.

Otomatik artan bir alanınız olduğundan, bunun sıralama alanı olmasını istediğinizi varsayalım. Bu durumda, aşağıdakileri yapmak isteyebilirsiniz:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

Sırasız sıralar dizisini your_auto_increment_field(veya adını verdiğiniz her şeyi) azalan sırada nasıl sıraladığımızı görün. Sonra sonuç kümesini yalnızca ilk satıra sınırlandırırız LIMIT 1.


25

@Spacepille tarafından önerilen iki sorguyu aşağıdaki gibi görünen tek bir sorguda birleştirebilirsiniz:

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

Hızlı bir şekilde çalışmalıdır, ancak INNODB tablolarında milisaniyenin bir kesimi ORDER + LIMIT'ten daha yavaştır.


@karthikeyan cevabını dört gün önce yazdı ve ben bunu Aralık 2015'te cevapladım.
vzr

hayır, 4 gün önce bazı yazımları düzenledim ve düzelttim ... posta tarihi 2014 answered Jun 14 at 9:41thats yaklaşık 1 yıl 6 ay önce :)
Dwza

Sadece havayı temizlemek için vzr doğru. '14 Haziran' 14 Haz 2016 anlamına geliyor, ayrıca @karthikeyan bu noktada sadece iki aydır üye.
Robert Brisita

Ssooo ... @ karthikeyan'ın cevabı bunun bir kopyası!
Cliff Burton

24

birçok satır içeren tablolarda muhtemelen daha hızlı iki sorgu vardır ...

SELECT @last_id := MAX(id) FROM table;

SELECT * FROM table WHERE id = @last_id;


4

En son eklenenleri istiyorsanız, bir zaman damgası ekleyin ve en yüksek zaman damgasına göre ters sırada sıralamayı seçin, 1 sınırlayın. Kimliğe göre gitmek istiyorsanız, kimliğe göre sıralayın. SADECE eklediğinizi kullanmak istiyorsanız kullanın mysql_insert_id.


4

Hemen hemen her veritabanı tablosunda bir auto_increment sütunu vardır (genellikle id)

Tablodaki tüm satırların sonuncusunu istiyorsanız,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

VEYA

İki sorguyu aşağıdaki gibi görünen tek bir sorguda birleştirebilirsiniz:

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

otomatik artış yalnızca DBA (veya tabloyu kim yaptıysa) otomatik artışlar uyguladıysa orada olur
WhatsThePoint

2
SELECT * FROM adds where id=(select max(id) from adds);

Bu sorgu tablonuzdaki son kaydı almak için kullanılır.


Aşağıdaki cevabın kopyası
Jbur43

2

Buradaki birçok yanıt aynı (otomatik artışınıza göre sırala) diyor ki, dizin oluşturulmuş otomatik büyütülmüş bir sütununuz varsa sorun yok.

Eğer böyle bir alan var ve eğer bir yan not, bir birincil anahtar, kullanmak için hiçbir performans cezası yoktur order bykarşısında select max(id). Birincil anahtar, verilerin veri tabanı dosyalarında nasıl sipariş edildiğidir (en azından InnoDB için) ve RDBMS, verilerin nerede bittiğini bilir ve order by id + limit 1erişim ile aynı olacak şekilde optimize edebilirmax(id)

Artık daha az seyahat edilen yol, otomatik büyütülmüş bir birincil anahtarınız olmadığı zamandır. Belki birincil anahtar, 3 alanın bir bileşimi olan doğal bir anahtardır ... Yine de hepsi kaybolmaz. Bir programlama dilinden önce ile satır sayısını elde edebilirsiniz.

SELECT Count(*) - 1 AS rowcount FROM <yourTable>;

ve sonra LIMITmadde içinde elde edilen sayıyı kullanın

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

Maalesef, MySQL LIMITyan tümcesinde bir alt sorguya veya kullanıcı değişkenine izin vermeyecektir


1

Bir kullanabilirsiniz OFFSETbir de LIMITkomuta:

SELECT * FROM aTable LIMIT 1 OFFSET 99

tablonuzun 100 satırı olması durumunda, birincil_anahtarına dayanmadan son satırı döndürür

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.