Comment puis-je SELECT
la dernière ligne d'une table MySQL?
Je suis INSERT
ing 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.
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;
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
.
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;
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.
Faites-le simplement utiliser: PDO::lastInsertId
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
.
SELECT * FROM adds where id=(select max(id) from adds);
Cette requête permet de récupérer le dernier enregistrement de votre table.
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.
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
.
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);