Comment pourrais-je faire quelque chose comme ça?
SQL SELECT ligne FROM table WHERE id = max (id)
Comment pourrais-je faire quelque chose comme ça?
SQL SELECT ligne FROM table WHERE id = max (id)
Réponses:
Vous pouvez utiliser une sous-sélection:
SELECT row
FROM table
WHERE id=(
SELECT max(id) FROM table
)
Notez que si la valeur de max(id)
n'est pas unique, plusieurs lignes sont renvoyées.
Si vous ne voulez qu'une seule ligne, utilisez la réponse de @ MichaelMior,
SELECT row from table ORDER BY id DESC LIMIT 1
id
n'est qu'une colonne dans un tableau. Il n'y a aucune garantie que les valeurs de la id
colonne doivent être uniques.
id
n'est pas une clé primaire ou unique :) Étant donné le nom, il y a une chance raisonnable que ce soit le cas. Il convient également de noter qu'en fonction du SGBD que vous utilisez, l'approche avec la sous-sélection peut être beaucoup moins efficace.
id
peut être une clé étrangère, auquel cas elle peut ne pas être unique. J'ai fait des analyses comparatives en utilisant set profiling = 1; ...; show profiles
et il semble que nos solutions aient les mêmes performances avec MySQL. Pour ma propre connaissance, savez-vous quel SGBD a de moins bonnes performances pour les sous-sélections?
Tu pourrais aussi faire
SELECT row FROM table ORDER BY id DESC LIMIT 1;
Cela triera les lignes par leur ID dans l'ordre décroissant et retournera la première ligne. Cela revient à renvoyer la ligne avec l'ID maximum. Cela suppose bien sûr qu'il id
est unique parmi toutes les lignes. Sinon, il pourrait y avoir plusieurs lignes avec la valeur maximale pour id
et vous n'en obtiendrez qu'une.
SELECT *
FROM table
WHERE id = (SELECT MAX(id) FROM TABLE)
SELECT entry FROM table WHERE id = MAX(id)
ne fonctionnerait pas?!
SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email)
où j'ai juste besoin entry_time
de l'entrée la plus récente dans la base de données. Cette déclaration est-elle suffisante ou devrait-elle l'être:SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
Vous ne pouvez pas donner order by
car order by
fait un "scan complet" sur une table.
La requête suivante est meilleure:
SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table);
ORDER BY
n'effectuera pas d'analyse complète si vous supposez qu'il id
s'agit de la clé primaire de la table. (Et si ce n'est pas le cas, il est plutôt mal nommé.) Si ce n'est pas le cas, comment comptez-vous MAX(id)
travailler sans une analyse complète de la table? S'il n'y a pas d'index, chaque valeur doit encore être vérifiée pour trouver le maximum.
On peut toujours opter pour des fonctions analytiques qui vous donneront plus de contrôle
select tmp.row from ( select row, rank() over(partition by id order by id desc ) as rnk from table) tmp where tmp.rnk=1
Si vous rencontrez un problème avec la fonction rank () en fonction du type de données, vous pouvez également choisir entre row_number () ou dense_rank ().
Essayez avec ça
SELECT top 1 id, Col2, row_number() over (order by id desc) FROM Table