SQL'de bir tablonun son kaydı nasıl seçilir?


133

Bu, bir tablodan tüm kayıtları seçmek için örnek bir koddur. Birisi bana o tablonun son kaydını nasıl seçeceğimi gösterebilir mi?

select * from table

Kullandığımda: SELECT * FROM TABLE ORDER BY ID DESC LIMIT Şu hatayı alıyorum: Satır 1: 'LIMIT' yakınında yanlış sözdizimi. Kullandığım kod bu:

private void LastRecord()
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HELPDESK_OUTLOOKConnectionString3"].ToString());

    conn.Open();
    SqlDataReader myReader = null;
    SqlCommand myCommand = new SqlCommand("SELECT * FROM HD_AANVRAGEN ORDER BY " +
                "aanvraag_id DESC LIMIT 1", conn);
    myReader = myCommand.ExecuteReader();
    while (myReader.Read())
    {
        TextBox1.Text = (myReader["aanvraag_id"].ToString());
        TextBox1.Text += (myReader["wijziging_nummer"].ToString());
        TextBox1.Text += (myReader["melding_id"].ToString());
        TextBox1.Text += (myReader["aanvraag_titel"].ToString());
        TextBox1.Text += (myReader["aanvraag_omschrijving"].ToString());
        TextBox1.Text += (myReader["doorlooptijd_id"].ToString());
        TextBox1.Text += (myReader["rapporteren"].ToString());
        TextBox1.Text += (myReader["werknemer_id"].ToString());
        TextBox1.Text += (myReader["outlook_id"].ToString());
    }
}

Şey, bir şey sipariş etmelisin. Birincil anahtarınız var mı? Belki bir kimlik?
alexn

"Son kayıt" ile ne demek istiyorsun? En yüksek birincil anahtar sütunu değerine sahip mi?
Marcin Wroblewski

Yanıtlar:


338

Daha fazla bilgi olmadan, hangi Veritabanı vb. Yapabileceğimizin en iyisi,

SQL Server

SELECT TOP 1 * FROM Table ORDER BY ID DESC

MySQL

SELECT * FROM Table ORDER BY ID DESC LIMIT 1

1
ilk 1 ilkini alacak değil mi?
Tassisto

30
Evet, ancak bu yüzden DESC
Adriaan Stander'a

3
Ancak DESC tarafından bir milyon kayıt için sipariş verdiyseniz, @AdriaanStander
Charles Hernandez

1
Mysql one ayrıca sql server ile de çalışır. Bu genel bir sql komutudur.
azhar22k

1
@ itz-azhar: bu sorgunun MySQL şeklidir değil genel bir SQL komutu; LIMITAnahtar kelime sadece bazı RDBMS'lerinde uygulamak olduğunu SQL bir uzantısıdır; Oracle'ın LIMITanahtar kelimesi yok
landru27

23

Bir Kimlik sütununuz olduğunu varsayarsak:

SELECT TOP 1 *
  FROM table
 ORDER
    BY Id DESC;

Ayrıca, bu SQL Server üzerinde çalışacaktır. MySQL kullanmanız gerekebileceğini düşünüyorum:

SELECT *
  FROM table
 ORDER
    BY Id DESC
 LIMIT 1

Ama bundan% 100 emin değilim.

DÜZENLE

Diğer cevaplara baktığımda, MySQL ifadesiyle doğru olduğumdan% 100 eminim: o)

DÜZENLE

Son yorumunuzu az önce gördüm. Yapabilirsin:

SELECT MAX(Id)
  FROM table

Bu size en yüksek kimlik numarasını verecektir.


2
Verilerden MAX (id) SEÇİN Mükemmel çalışıyor!
Ricardo Fercher

15

Geçen almak için satır a SQL Veritabanı bu sql dizesi kullanabilirsiniz:

SELECT * FROM TableName WHERE id=(SELECT max(id) FROM TableName);

Çıktı:

DB'nizin Son Satırı!


3
Oracle ile de tamamen iyi çalışıyor ve sıralamadan daha hızlı
MaKiPL

Bu en iyisi. Sıralama yok, "İLK 1" yok, sadece desteklenen ve performanslı sorgular. Mükemmel.
Matt F.

7
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

Evet bu mysql, SQL Server:

SELECT TOP 1 * FROM Table ORDER BY ID DESC

bu bir hata veriyor! Bunun SQL olduğunu düşünmüştüm ama MySQL
Tassisto

1
SQL Server'da düzenlendi, ancak soruda DBMS'nizi belirtmediniz.
Simon

3
SELECT * FROM table ORDER BY Id DESC LIMIT 1

2

Sonuncusu, siparişinizi tersine çevirdiğinizde yalnızca ilkidir.


1

Tablo tasarımınızda otomatik satır tanımlayıcıya sahip olmak her zaman iyi bir uygulamadır.

 [RowID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL

, son satırınızı şu şekilde tanımlayabilirsiniz:

 select * from yourTable where rowID =  @@IDENTITY 

1
Bu harika bir numara, 2
milyondan fazla

0

Oracle'da şunları yapabilirsiniz:

SELECT *
FROM (SELECT EMP.*,ROWNUM FROM EMP ORDER BY ROWNUM DESC)
WHERE ROWNUM=1;

Bu olası yollardan biridir.


0
select ADU.itemid, ADU.startdate, internalcostprice 
from ADUITEMINTERNALCOSTPRICE ADU

right join

   (select max(STARTDATE) as Max_date, itemid 
   from ADUITEMINTERNALCOSTPRICE
   group by itemid) as A

on A.ITEMID = ADU.ITEMID
and startdate= Max_date

1
Stackoverflow'a hoş geldiniz. Sağladığınız yanıta ek olarak, lütfen bunun sorunu neden ve nasıl düzelttiğine dair kısa bir açıklama sağlayın.
jtate

0

Bence bunu yapmalı.

declare @x int;
select @x = max(id) from table_name;
select * from where id = @x;

0

Kendi kendine artan bir alanınız varsa (söyleyin ID), o zaman aşağıdaki gibi bir şey yapabilirsiniz: SELECT * FROM foo WHERE ID = (SELECT max(ID) FROM foo)


-1
$sql="SELECT tot_visit FROM visitors WHERE date = DATE(NOW()) - 1 into @s                
$conn->query($sql);
$sql = "INSERT INTO visitors (nbvisit_day,date,tot_visit) VALUES (1,CURRENT_DATE,@s+1)";
$conn->query($sql);

soruyu dikkatlice okudun mu? nasıl yok INSERTyeni değer 'nasıl tablosunun son kayıt seçmek için' ilişki ing'?
landru27

2
Stack Overflow'a hoş geldiniz! Sınırlı ve anında yardım sağlayabilecek kod parçacığı için teşekkür ederiz. Uygun bir açıklama, bunun neden soruna iyi bir çözüm olduğunu açıklayarak uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer sorularla gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar da dahil olmak üzere bazı açıklamalar eklemek için lütfen cevabınızı düzenleyin.
sepehr

OP sadece SQL dili hakkında soru sorduğunda php'ye özel kod yazmayın.
steve moretz


-1

Ricardo'ya oy verdim. Aslında max, sıralamadan çok daha etkilidir. Farkları görün. Bu mükemmel.

Son satırı / güncelleme kaydını almak zorunda kaldım (timeStamp)

`sqlite> select timeStamp from mypadatav2 order by timeStamp desc limit 1;
 2020-03-11 23:55:00
 Run Time: real 1.806 user 1.689242 sys 0.117062`

`sqlite> select max(timeStamp) from mypadatav2;
 2020-03-11 23:55:00
 Run Time: real 0.553 user 0.412618 sys 0.134340`
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.