2010-05-05 8 views
18

Je dois simplement sélectionner la dernière ligne entrée spécifiée par condition, par exemple:MySQL - Sélectionnez la dernière ligne insérée meilleure manière

SELECT ID from bugs WHERE user=Me 

Je dois retourner seulement le dernier ID est entré par l'utilisateur « Me ». Y a-t-il un moyen simple de le faire? Je vous remercie.

+0

La meilleure réponse que je trouve est celui par Pomyk [ici] (http://stackoverflow.com/questions/1388025/how-to-get-id-of-the-last-updated -row-in-mysql # answer-1751282) – aggregate1166877

Répondre

35

Il est préférable d'avoir une colonne TIMESTAMP par défaut CURRENT_TIMESTAMP .. c'est le seul vrai comportement prédictif que vous pouvez trouver ici.

La deuxième meilleure chose que vous pouvez faire est ORDER BY ID DESC LIMIT 1 et espérons que le plus récent ID est la plus grande valeur.

27
SELECT MAX(ID) from bugs WHERE user=Me 
7

En accès simultané, le dernier enregistrement n'est peut-être pas l'enregistrement que vous venez d'entrer. Il peut être préférable d'obtenir le dernier enregistrement en utilisant la clé primaire.

S'il s'agit d'un champ d'incrémentation automatique, utilisez SELECT LAST_INSERT_ID(); pour obtenir l'ID que vous venez de créer.

+0

'LAST_INSERT_ID()' est global. Il ne renverra pas d'ID basé sur une condition. – Matt

+6

Cette ** seulement ** fonctionne si vous n'effectuez pas d'insertion après la ligne que vous essayez d'interroger. Par exemple, si quelqu'un s'inscrit ('insert into users ...') puis crée un post ('insert into posts ...'), 'last_insert_id()' se référera au dernier 'posts.id'. À ce stade, il n'y a aucun moyen de sélectionner le dernier utilisateur en utilisant 'last_insert_id()'. –

+0

ok, je me méprends sur la question, merci. – Wayne

12

Une façon d'accomplir cela est de vous commander des enregistrements et de limiter à 1. Par exemple si vous avez le tableau suivant ('données').

id | user | price 
    ------------------- 
    1 | me | 40.23 
    2 | me | 10.23 

Essayez la requête suivante sql

select * from data where user='me' order by id desc limit 1 
23

Vous pouvez utiliser ORDER BY ID DESC, mais il est beaucoup plus rapide si vous allez de cette façon:

SELECT * FROM bugs WHERE user = 'me' AND ID = (SELECT MAX(ID) FROM bugs WHERE user = 'me') 

Dans le cas où vous avez une grande table, cela pourrait faire une différence significative.

EDIT

Vous pouvez même définir une variable dans le cas où vous en avez besoin plus d'une fois (ou si vous pensez qu'il est plus facile à lire).

SELECT @bug_id := MAX(ID) FROM bugs WHERE user = 'me'; 
SELECT * FROM bugs WHERE user = 'me' AND ID = @bug_id; 
+0

J'ai effectivement chronométré sur quelques centaines de requêtes. la clé 'ORDER BY' 'DESC LIMIT 1', peut être 200+ millisecondes (plus de 65%) plus rapide que la 'SELECT' de' SELECT'. puis encore, ma base de données est super petite, la requête entière ne prend pas plus de 900 millisecondes, donc je suppose que sur le tri à plus grande échelle pourrait être plus lent. mais encore une fois, les implémentations MYSQL optimisant probablement les requêtes couramment utilisées telles que 'ORDER BY 'KEY' DESC LIMIT 1', donc le résultat final prendra beaucoup (beaucoup!) Moins alors réellement le tri puis renvoyer le dernier résultat. –

+7

Ok, alors peut-être que c'est plus rapide avec une petite table. C'est bon à savoir! Par contre, ma solution est encore beaucoup plus rapide pour une énorme table.Je l'ai testé avec une table d'environ 35 000 lignes et c'était 10 fois plus rapide que la solution avec ORDER. – pmrotule

3
SELECT * FROM `table_name` 
ORDER BY `table_name`.`column_name` DESC 
LIMIT 1 
Questions connexes