Böyle bir şeyi nasıl yaparım?
SQL SELECT satırı tablodan WHERE id = max (id)
Böyle bir şeyi nasıl yaparım?
SQL SELECT satırı tablodan WHERE id = max (id)
Yanıtlar:
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
idtablodaki bir sütun. idSütundaki değerlerin benzersiz olması gerektiği konusunda bir garanti yoktur .
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.
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?
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.
SELECT *
FROM table
WHERE id = (SELECT MAX(id) FROM TABLE)
SELECT entry FROM table WHERE id = MAX(id)işe yaramaz mı ?!
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
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);
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.
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.
Bununla dene
SELECT top 1 id, Col2, row_number() over (order by id desc) FROM Table