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
id
tablodaki bir sütun. id
Sütundaki değerlerin benzersiz olması gerektiği konusunda bir garanti yoktur .
id
Birincil 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.
id
yabancı bir anahtar olabilir, bu durumda benzersiz olmayabilir. Ben kullanarak bazı kıyaslama yaptım set profiling = 1; ...; show profiles
ve çö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 id
tüm satırlar arasında benzersiz olduğunu varsayar . Aksi takdirde, maksimum değeri olan birden fazla satır olabilir id
ve 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_time
veritabanı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 by
bir tablo üzerinde "tam tarama" yapar.
Aşağıdaki sorgu daha iyidir:
SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table);
ORDER BY
id
tablonun 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