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());
    }
}
Tassisto
quelle
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
Adriaan Stander
quelle
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.

Neil Knight
quelle
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!

Ricardo Fercher
quelle
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
Simon
quelle
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

quelle
2

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

jeje
quelle
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.

GeeDee
quelle
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
Panjas51
quelle
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 
Jenna Leaf
quelle
0

Ich denke das sollte es tun.

declare @x int;
select @x = max(id) from table_name;
select * from where id = @x;
Chanuka Fernando
quelle
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)

Bostone
quelle
-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);
Hani Charara
quelle
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

Sie können auch so etwas tun:

SELECT LAST (column_name) AS LAST_CUSTOMER FROM table_name;

vikas95prasad
quelle
Sie sollten beachten, dass die Funktion last () nur in MS Access unterstützt wird. Javatpoint.com/sql-select-last
malik masis
-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`
user12403395
quelle