Sélectionnez la dernière ligne dans MySQL

194

Comment puis-je SELECTla dernière ligne d'une table MySQL?

J'utilise des INSERTdonnées et je dois récupérer une valeur de colonne de la ligne précédente.

Il y a un auto_incrementdans le tableau.

esqew
la source
8
Définissez "dernière ligne". Celui avec l'ID le plus élevé? Ou le dernier ajouté?
EboMike
1
Qu'est-ce qui indique la dernière ligne - Y a-t-il une colonne auto_increment ou DATETIME dans la table?
OMG Ponies
Oui, il y a un auto_incrementdedans. J'aimerais le dernier ajouté.
esqew
9
Il n'y a pas de dernière ligne dans un set, comme l'ont dit EboMike et OMG Ponies. Que feriez-vous si je vous donnais un sac plein de balles et vous demandais de me donner la dernière balle?
Vincent Savard

Réponses:

417

Oui, il y a un auto_increment là-dedans

Si vous voulez la dernière de toutes les lignes du tableau, alors c'est enfin le moment où se MAX(id)trouve la bonne réponse! En quelque sorte:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;
Pekka
la source
18
J'ai peur que cela devienne lent s'il a besoin de trier des millions de lignes, n'est-ce pas?
Slawa
3
J'ai juste couru ça sur 20m de rangs et c'était très rapide. Je suppose qu'il existe une sorte de cas particulier pour traiter cette requête. (EDIT: MySQL 5.7, moteur InnoDB)
Daniel Buckmaster
1
@Pekka: Je ne veux pas utiliser order by, y a-t-il une autre option pour le faire?
shiva
4
@Slawa Pas si idest indexé.
Marquis of Lorne
31

Gardez à l'esprit que les tables des bases de données relationnelles ne sont que des ensembles de lignes. Et les ensembles en mathématiques sont des collections non ordonnées. Il n'y a ni première ni dernière ligne; pas de ligne précédente ni de ligne suivante.

Vous devrez d'abord trier votre ensemble de lignes non ordonnées par un champ, puis vous serez libre de l'itérer dans l'ensemble de résultats dans l'ordre que vous avez défini.

Puisque vous avez un champ à incrémentation automatique, je suppose que vous voulez que ce soit le champ de tri. Dans ce cas, vous souhaiterez peut-être effectuer les opérations suivantes:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

Voyez comment nous trions d'abord l'ensemble des lignes non ordonnées par your_auto_increment_field(ou ce que vous avez appelé) dans l'ordre décroissant. Ensuite, nous limitons le jeu de résultats à la première ligne avec LIMIT 1.

Daniel Vassallo
la source
25

Vous pouvez combiner deux requêtes suggérées par @spacepille en une seule requête qui ressemble à ceci:

SELECT * FROM `table_name` WHERE id=(SELECT MAX(id) FROM `table_name`);

Cela devrait fonctionner très vite, mais sur les tables INNODB, c'est une fraction de milliseconde plus lente que ORDER + LIMIT.

vzr
la source
1
@karthikeyan a écrit sa réponse il y a quatre jours et j'y ai répondu en décembre 2015.
vzr
non, j'ai édité et corrigé certaines orthographes il y a 4 jours ... la date de publication est 2014 answered Jun 14 at 9:41c'est environ 1 an et 6 mois plus tôt :)
Dwza
1
Juste pour purifier l'air ici, vzr a raison. Le `` 14 juin '' signifie le 14 juin 2016 et @karthikeyan n'est membre que depuis deux mois à ce stade.
Robert Brisita
1
Ssooo ... La réponse de @ karthikeyan est une copie de celle-ci!
Cliff Burton
24

sur les tables avec de nombreuses lignes, deux requêtes sont probablement plus rapides ...

SELECT @last_id := MAX(id) FROM table;

SELECT * FROM table WHERE id = @last_id;
Spacepille
la source
8

Faites-le simplement utiliser: PDO::lastInsertId

http://php.net/manual/en/pdo.lastinsertid.php

macio.Jun
la source
2
Droite. La plupart des bibliothèques d'interface MySQL décentes ont des méthodes dédiées pour cela, mais cette question n'était pas étiquetée PHP mais la syntaxe générale de MySQL.
vzr
5

Si vous voulez le dernier ajouté, ajoutez un horodatage et sélectionnez trié dans l'ordre inverse par horodatage le plus élevé, limite 1. Si vous voulez aller par ID, triez par ID. Si vous voulez utiliser celui que vous venez d'ajouter, utilisez mysql_insert_id.

EboMike
la source
4

Presque chaque table de base de données, il y a une colonne auto_increment (généralement id)

Si vous voulez la dernière de toutes les lignes du tableau,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

OU

Vous pouvez combiner deux requêtes en une seule requête qui ressemble à ceci:

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);
Sani Kamal
la source
l'incrémentation automatique n'est là que si le DBA (ou celui qui a créé la table) a implémenté des incréments automatiques
WhatsThePoint
2

Beaucoup de réponses ici disent la même chose (ordre par incrémentation automatique), ce qui est OK, à condition que vous ayez une colonne auto-incrémentée indexée.

Par ailleurs, si vous avez un tel champ et qu'il s'agit de la clé primaire, il n'y a aucune pénalité de performance pour l'utilisation de order byversus select max(id). La clé primaire est la façon dont les données sont classées dans les fichiers de la base de données (pour InnoDB au moins), et le SGBDR sait où ces données se terminent, et il peut être optimisé order by id + limit 1pour être le même que pour atteindre lemax(id)

Désormais, la route la moins fréquentée est celle où vous n'avez pas de clé primaire auto-incrémentée. Peut-être que la clé primaire est une clé naturelle, qui est un composite de 3 champs ... Cependant, tout n'est pas perdu. À partir d'un langage de programmation, vous pouvez d'abord obtenir le nombre de lignes avec

SELECT Count(*) - 1 AS rowcount FROM <yourTable>;

puis utilisez le nombre obtenu dans la LIMITclause

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

Malheureusement, MySQL n'autorisera pas de sous-requête ou de variable utilisateur dans la LIMITclause

Ilia Gilmijarow
la source
1
SELECT * FROM adds where id=(select max(id) from adds);

Cette requête permet de récupérer le dernier enregistrement de votre table.

karthikeyan
la source
1
Copie de la réponse ci
Jbur43
1

Vous pouvez utiliser un OFFSETdans une LIMITcommande:

SELECT * FROM aTable LIMIT 1 OFFSET 99

dans le cas où votre table a 100 lignes, cela renvoie la dernière ligne sans compter sur une clé primaire

Benvorth
la source