Wie wähle ich den letzten Datensatz einer Tabelle in SQL aus?


132

Dies ist ein Beispielcode zum Auswählen aller Datensätze aus einer Tabelle. Kann mir jemand zeigen, wie man den letzten Datensatz dieser Tabelle auswählt?

select * from table

Wenn ich Folgendes verwende: SELECT * FROM TABLE ORDER BY ID DESC LIMIT Ich erhalte folgende Fehlermeldung: Zeile 1: Falsche Syntax in der Nähe von 'LIMIT'. Dies ist der Code, den ich benutze:

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());
    }
}

Nun, Sie müssen etwas bestellen. Haben Sie einen Primärschlüssel? Vielleicht ein Ausweis?
Alexn

Was meinst du mit "letzte Aufnahme"? Mit dem höchsten Wert der Primärschlüsselspalte?
Marcin Wroblewski

Antworten:


334

Ohne weitere Informationen, welche Datenbank usw. das Beste ist, was wir tun können, ist so etwas wie

SQL Server

SELECT TOP 1 * FROM Table ORDER BY ID DESC

MySql

SELECT * FROM Table ORDER BY ID DESC LIMIT 1

1
Top 1 wird den ersten nehmen, nicht?
Tassisto

29
Ja, aber deshalb bestellen Sie bei DESC
Adriaan Stander

3
Aber wenn Sie die Bestellung von DESC für eine Million Datensätze verwendet haben, wird Ihre Anfrage @AdriaanStander
Charles Hernandez

1
Das MySQL funktioniert auch mit SQL Server. Es ist ein generischer SQL-Befehl.
Azhar22k

1
@ itz-azhar: Die MySQL-Form dieser Abfrage ist kein generischer SQL-Befehl. Das LIMITSchlüsselwort ist eine Erweiterung von SQL, die nur einige RDBMS implementieren. LIMIT
Insbesondere

23

Angenommen, Sie haben eine ID-Spalte:

SELECT TOP 1 *
  FROM table
 ORDER
    BY Id DESC;

Dies funktioniert auch unter SQL Server. Ich denke, dass Sie MySQL möglicherweise verwenden müssen:

SELECT *
  FROM table
 ORDER
    BY Id DESC
 LIMIT 1

Aber da bin ich mir nicht 100% sicher.

BEARBEITEN

Wenn ich mir die anderen Antworten ansehe, bin ich jetzt zu 100% sicher, dass ich mit der MySQL-Anweisung richtig bin: o)

BEARBEITEN

Habe gerade deinen letzten Kommentar gesehen. Du könntest es tun:

SELECT MAX(Id)
  FROM table

Dadurch erhalten Sie die höchste ID-Nummer.


2
SELECT MAX (id) FROM data Funktioniert perfekt!
Ricardo Fercher

15

Verwenden Sie diese SQL- Zeichenfolge , um die letzte Zeile einer SQL-Datenbank abzurufen:

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

Ausgabe:

Letzte Zeile Ihrer Datenbank!


3
Funktioniert auch mit Orakel
einwandfrei

Dieser ist der beste. Keine Sortierung, keine "TOP 1", nur unterstützte und performante Abfragen. Perfekt.
Matt F.

7
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

Ja, das ist MySQL, SQL Server:

SELECT TOP 1 * FROM Table ORDER BY ID DESC

das gibt einen fehler! Ich dachte, dass dies SQL ist, aber es ist MySQL
Tassisto

1
In SQL Server bearbeitet, Sie haben jedoch Ihr DBMS in der Frage nicht angegeben.
Simon

3
SELECT * FROM table ORDER BY Id DESC LIMIT 1

2

Der letzte ist nur der erste, wenn Sie Ihre Bestellung stornieren.


0

In Oracle können Sie Folgendes tun:

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

Dies ist einer der möglichen Wege.


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
Willkommen bei stackoverflow. Zusätzlich zu der Antwort, die Sie gegeben haben, sollten Sie eine kurze Erklärung darüber geben, warum und wie dies das Problem behebt.
8.

0

Es ist immer eine gute Praxis in Ihrem Tabellenentwurf, eine automatische Zeilenkennung zu haben, wie z

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

, dann können Sie Ihre letzte Zeile durch identifizieren

 select * from yourTable where rowID =  @@IDENTITY 

0

Ich denke das sollte es tun.

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

0

Wenn Sie ein sich selbst inkrementierendes Feld haben (sagen wir ID), können Sie Folgendes tun: 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);

Hast du die Frage sorgfältig gelesen? Wie hängt INSERTein neuer Wert mit "Wie wählt man den letzten Datensatz dieser Tabelle aus" zusammen?
landru27

2
Willkommen bei Stack Overflow! Vielen Dank für das Code-Snippet, das möglicherweise nur begrenzte, sofortige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie beschreibt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
September

Schreiben Sie keinen PHP-spezifischen Code, wenn OP nur nach der SQL-Sprache gefragt hat.
Steve Moretz


-1

Ich habe Ricardo positiv bewertet. Eigentlich ist max viel effizienter als das Sortieren. Sehen Sie die Unterschiede. es ist exzellent.

Ich musste den letzten Zeilen- / Aktualisierungsdatensatz (timeStamp) abrufen.

`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`
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.