web-dev-qa-db-fra.com

Sélectionner la dernière ligne dans MySQL

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

Je suis INSERTing data et je dois récupérer une valeur de colonne de la ligne précédente.

Il y a un auto_increment dans la table.

142
esqew

Oui, il y a un auto_increment dedans 

Si vous voulez le dernier de toutes les lignes de la table, c'est finalement l'heure à laquelle MAX(id) est la bonne réponse! Genre de:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;
322
Pekka 웃

N'oubliez pas 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 pas de première ou dernière ligne; pas de ligne précédente ou suivante. 

Vous devez d'abord trier votre ensemble de lignes non ordonnées en fonction d'un champ, puis vous êtes libre d'itérer dans l'ensemble de résultats dans l'ordre que vous avez défini.

Puisque vous avez un champ d’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 commençons par trier l'ensemble de lignes non ordonnées selon le your_auto_increment_field (ou le nom que vous avez appelé) dans l'ordre décroissant. Ensuite, nous limitons l'ensemble de résultats à la première ligne avec LIMIT 1.

25
Daniel Vassallo

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

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

SELECT * FROM table WHERE id = @last_id;
20
spacepille

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

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

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

13
vzr

Faites-le simplement utiliser: PDO::lastInsertId

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

7
macio.Jun

Si vous souhaitez ajouter celui qui a été ajouté en dernier, ajoutez un horodatage et sélectionnez Ordre dans l’ordre inverse de l’horodatage le plus élevé, limite 1. Si vous souhaitez définir un ID, triez-le par ID. Si vous voulez utiliser celui que vous venez d'ajouter, utilisez mysql_insert_id.

4
EboMike
SELECT * FROM adds where id=(select max(id) from adds);

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

3
karthikeyan

Vous pouvez utiliser une OFFSET dans une commande LIMIT:

SELECT * FROM aTable LIMIT 1 OFFSET 99

dans le cas où votre table a 100 lignes, la dernière ligne est renvoyée sans utiliser une clé primaire.

0
Benvorth

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

Sur une note de côté, si vous avez ce champ et qu'il est la clé primaire, l'utilisation de order by par rapport à select max(id) n'est pas pénalisante. La clé primaire est la manière 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 optimiser order by id + limit 1 pour qu'il soit identique à atteindre la fonction max(id).

Maintenant, 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, composée de 3 champs ... Cependant, tout n'est pas perdu. A 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 clause LIMIT

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

Malheureusement, MySQL n'autorisera pas de sous-requête ni de variable utilisateur dans la clause LIMIT.

0
Ilia Gilmijarow

Presque toutes les tables de base de données, il y a une colonne auto_increment (généralement id)

Si vous voulez la dernière des lignes du tableau,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

OR

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

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);
0
Sani Kamal