Tablodaki en büyük kimliğe sahip bir satırın tamamını nasıl seçerim?


Yanıtlar:


228

Bir alt seçim kullanabilirsiniz:

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

Değeri max(id)benzersiz değilse, birden çok satır döndürüldüğünü unutmayın.

Böyle bir satır istiyorsanız, @ MichaelMior'un cevabını kullanın,

SELECT row from table ORDER BY id DESC LIMIT 1

6
@AlirezaSoori: İsme rağmen, idtablodaki bir sütun. idSütundaki değerlerin benzersiz olması gerektiği konusunda bir garanti yoktur .
unutbu

1
@unutbu idBirincil veya benzersiz bir anahtar olmadığını varsayarsak :) Adı göz önüne alındığında makul bir şansı vardır. Kullandığınız DBMS'ye bağlı olarak, alt seçimle olan yaklaşımın çok daha az verimli olabileceğini de belirtmek gerekir.
Michael Mior

3
@MichaelMior: idyabancı bir anahtar olabilir, bu durumda benzersiz olmayabilir. Ben kullanarak bazı kıyaslama yaptım set profiling = 1; ...; show profilesve çözümlerimizin MySQL kullanarak aynı performansa sahip gibi görünüyor. Kendi bilgime göre, DBMS'nin alt seçimler için daha düşük performansa sahip olduğunu biliyor musunuz?
unutbu

1
Yabancı bir anahtar olabilir, ama dediğim gibi, sadece ismine dayanarak tahmin ediyorum. MySQL'in geçmişte alt seçimlerle kötü performans gösterdiği bilinmektedir. Bu, yeni sürümlerde büyük ölçüde iyileşti, bu nedenle hangi sürümü kullandığınıza bağlı. Ancak, yeniden düşündüğünüzde, bu sorgu doğru olabilir. Bir sorguyu profille birkaç kez çalıştırmak, göreceli performans hakkında çok fazla şey söylemese de.
Michael Mior

149

Ayrıca yapabilirsin

SELECT row FROM table ORDER BY id DESC LIMIT 1;

Bu, satırları kimliklerine göre azalan sırada sıralar ve ilk satırı döndürür. Bu, satırı maksimum kimliğe döndürmeyle aynıdır. Bu tabii ki idtüm satırlar arasında benzersiz olduğunu varsayar . Aksi takdirde, maksimum değeri olan birden fazla satır olabilir idve yalnızca bir tane alırsınız.


Özellikle OP'nin sorduğu şeyi yapmak için bunu yapardım. Ama diğer cevaplar SQL yapısı hakkında daha iyi bir eğitim sağlar :)
MatBailie

@Dems Nasıl yani? Başka bir cevap hakkında açıklama yapılmadı mı? Tabii ki de suçluyum :(
Michael Mior

Diğer sorular, mantığı yeniden düzenlemeden sözdizimini düzeltir. Böylece, OP bu belirli sql'in nasıl doğru bir şekilde ifade edileceğini öğrenir.
MatBailie

Adil nokta :) Diğer cevaplar hala mantığı düzeltebilir.
Michael Mior

Performans ne olacak? Bu tür bir sorgu ile zaten benim için çalışıyor, ama bunun doğru yol olup olmadığını merak ediyordum. ORDER BY O (n * log n) işlemi değil mi?
dhill

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

@ shA.t SELECT entry FROM table WHERE id = MAX(id)işe yaramaz mı ?!
oldboy

@ shA.t Ayrıca, ne gibi bir şey yapmaya çalışıyorum: SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email)böylece ben sadece entry_timeveritabanındaki en son giriş gerekir . Bu ifade yeterli mi ya da olmalı:SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
oldboy

Bir sorgu sonucundaki en son girdi için güvenilir bir anlam yoktur, ekleme zamanı için bir alanınız olması gerekir. BTW, lütfen sorunuzu ayrı olarak sorun, umarım daha fazla dikkat alırsınız -HTH;).
shA.t

17

Veremezsiniz order byçünkü order bybir tablo üzerinde "tam tarama" yapar.

Aşağıdaki sorgu daha iyidir:

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

18
ORDER BYidtablonun birincil anahtarı olduğunu varsayarsanız tam tarama yapmaz . (Ve değilse, oldukça kötü adlandırılmış.) Değilse, MAX(id)tam tablo taraması olmadan nasıl çalışmayı beklersiniz ? Endeks yoksa, maksimum değeri bulmak için her değer yine de kontrol edilmelidir.
Michael Mior

@CakeLikeBoss iyi "order by" sorgusu ve "SELECT * FROM tablosundan WHERE id = (SELECT MAX (id) FROM tablosundan);" Bu sorgu her seferinde tam olarak 0.0004 saniye sürerken, ikinci sorgu
0.0007'den 0.0010 saniyeye kadar sürerken,

1

Her zaman analitik fonksiyonlara da gidilebilir, bu da size daha fazla kontrol sağlar

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

Veri türüne bağlı olarak rank () işleviyle ilgili bir sorunla karşılaşırsanız, o da row_number () veya dense_rank () arasından seçim yapabilirsiniz.


0

Bununla dene

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

9
TOP anahtar sözcüğü MySQL'de çalışmıyor. Bu sorgu çalışmaz.
Anirudha Gupta

@toddmo: MySQL! Sql-Server da diğer insanlar için yararlı değildir. MS-SQL mi demek istiyorsun?
raiserle

@raiserle, bu soru hakkında yorum yaptığım veya gönderdiğim yeri bulmama yardımcı olabilir misiniz? Adımı bu soruya hiçbir yerde bağlı göremiyorum.
toddmo
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.