Comment sélectionner le dernier enregistrement d'une table en SQL?

133

Il s'agit d'un exemple de code pour sélectionner tous les enregistrements d'une table. Quelqu'un peut-il me montrer comment sélectionner le dernier enregistrement de cette table?

select * from table

Quand j'utilise: SELECT * FROM TABLE ORDER BY ID DESC LIMIT J'obtiens cette erreur: Ligne 1: Syntaxe incorrecte près de «LIMIT». Voici le code que j'utilise:

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
la source
Eh bien, vous devez commander quelque chose. Avez-vous une clé primaire? Peut-être une pièce d'identité?
alexn
Qu'entendez-vous par «dernier enregistrement»? Avec la valeur la plus élevée de la colonne de clé primaire?
Marcin Wroblewski

Réponses:

337

Sans plus d'informations, quelle base de données, etc., le mieux que nous puissions faire est quelque chose comme

Serveur SQL

SELECT TOP 1 * FROM Table ORDER BY ID DESC

MySql

SELECT * FROM Table ORDER BY ID DESC LIMIT 1
Adriaan Stander
la source
1
top 1 prendra le premier, non?
Tassisto
30
Oui, mais c'est pourquoi vous commandez par DESC
Adriaan Stander
3
Mais si vous avez utilisé la commande par DESC pour un million d'enregistrements, cela ralentira votre requête @AdriaanStander
Charles Hernandez
1
Celui de mysql fonctionne également avec le serveur sql. C'est une commande sql générique.
azhar22k
1
@ itz-azhar: la forme MySQL de cette requête n'est pas une commande SQL générique; le LIMITmot-clé est une extension de SQL que seuls certains SGBDR implémentent; notamment, Oracle n'a pas de LIMITmot
landru27
23

En supposant que vous ayez une colonne Id:

SELECT TOP 1 *
  FROM table
 ORDER
    BY Id DESC;

En outre, cela fonctionnera sur SQL Server. Je pense que MySQL vous devrez peut-être utiliser:

SELECT *
  FROM table
 ORDER
    BY Id DESC
 LIMIT 1

Mais je ne suis pas sûr à 100% à ce sujet.

ÉDITER

En regardant les autres réponses, je suis maintenant sûr à 100% que j'ai raison avec la déclaration MySQL: o)

ÉDITER

Je viens de voir votre dernier commentaire. Vous pourriez faire:

SELECT MAX(Id)
  FROM table

Cela vous donnera le numéro d'identification le plus élevé.

Neil Knight
la source
2
SELECT MAX (id) FROM data Fonctionne parfaitement!
Ricardo Fercher
15

pour obtenir la dernière ligne d'une base de données SQL, utilisez cette chaîne SQL:

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

Production:

Dernière ligne de votre db!

Ricardo Fercher
la source
3
Fonctionne parfaitement bien avec oracle aussi et est plus rapide que le tri
MaKiPL
Celui-ci est le meilleur. Pas de tri, pas de "TOP 1", juste des requêtes prises en charge et performantes. Parfait.
Matt F. le
7
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

Oui, c'est mysql, SQL Server:

SELECT TOP 1 * FROM Table ORDER BY ID DESC
Simon
la source
cela donne une erreur! Je pensais que c'était SQL mais c'est MySQL
Tassisto
1
Modifié sur SQL Server, mais vous n'avez pas spécifié votre SGBD dans la question.
Simon
3
SELECT * FROM table ORDER BY Id DESC LIMIT 1

la source
2

Le dernier n'est que le premier lorsque vous inversez votre commande.

jeje
la source
1

Dans la conception de votre table, il est toujours recommandé d'avoir un identifiant de ligne automatique, tel que

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

, vous pouvez alors identifier votre dernière ligne en

 select * from yourTable where rowID =  @@IDENTITY 
Feuille de Jenna
la source
C'est un truc cool, pour 2M + de disques c'est super rapide (du moins dans mon cas) Merci
Jeancarlo Fontalvo il y a
0

Dans Oracle, vous pouvez faire:

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

C'est l'un des moyens possibles.

GeeDee
la source
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
la source
1
Bienvenue dans stackoverflow. En plus de la réponse que vous avez fournie, pensez à fournir une brève explication des raisons et de la manière dont cela résout le problème.
jtate
0

Je pense que cela devrait le faire.

declare @x int;
select @x = max(id) from table_name;
select * from where id = @x;
Chanuka Fernando
la source
0

Si vous avez un champ auto-incrémenté (par exemple ID), vous pouvez faire quelque chose comme: SELECT * FROM foo WHERE ID = (SELECT max(ID) FROM foo)

Bostone
la source
-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
la source
avez-vous lu la question attentivement? comment INSERTune nouvelle valeur se rapporte-t-elle à "comment sélectionner le dernier enregistrement de cette table"?
landru27
2
Bienvenue dans Stack Overflow! Merci pour l'extrait de code, qui pourrait fournir une aide limitée et immédiate. Une explication appropriée améliorerait considérablement sa valeur à long terme en décrivant pourquoi c'est une bonne solution au problème, et la rendrait plus utile aux futurs lecteurs avec d'autres questions similaires. Veuillez modifier votre réponse pour ajouter des explications, y compris les hypothèses que vous avez formulées.
sepehr
N'écrivez pas de code spécifique à PHP lorsque OP a posé des questions sur le langage SQL uniquement.
steve moretz
-1

Vous pouvez également faire quelque chose comme ceci:

SELECT LAST (column_name) AS LAST_CUSTOMER FROM table_name;

vikas95prasad
la source
Vous devriez noter que la fonction last () n'est prise en charge que dans MS Access javatpoint.com/sql-select-last
malik masis
-1

J'ai voté pour Ricardo. En fait, max est beaucoup plus efficace que le tri. Voyez les différences. C'est excellent.

Je devais obtenir la dernière ligne / enregistrement de mise à jour (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`
user12403395
la source