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

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

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é.


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!


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

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

2

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


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 

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.


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
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;

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)


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

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

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`
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.