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:
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
ORDERBY your_auto_increment_field DESCLIMIT1;
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.
@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 ...
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.
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
SELECTCount(*) - 1AS 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
auto_increment
dedans. J'aimerais le dernier ajouté.Réponses:
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;
la source
id
est indexé.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 avecLIMIT 1
.la source
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.
la source
answered Jun 14 at 9:41
c'est environ 1 an et 6 mois plus tôt :)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;
la source
Faites-le simplement utiliser:
PDO::lastInsertId
http://php.net/manual/en/pdo.lastinsertid.php
la source
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
.la source
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);
la source
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 by
versusselect 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 1
pour ê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
LIMIT
clauseSELECT * FROM orderbook2 LIMIT <number_from_rowcount>, 1
Malheureusement, MySQL n'autorisera pas de sous-requête ou de variable utilisateur dans la
LIMIT
clausela source
SELECT * FROM adds where id=(select max(id) from adds);
Cette requête permet de récupérer le dernier enregistrement de votre table.
la source
Vous pouvez utiliser un
OFFSET
dans uneLIMIT
commande: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
la source