web-dev-qa-db-fra.com

Fonction MAX dans la clause where mysql

Comment utiliser la fonction max () dans la clause where d'une requête mysql, j'essaie:

 select firstName,Lastname,MAX(id) as max where id=max;

cela me donne une erreur:

Unknown column 'max' in 'where clause'

De l'aide? Merci d'avance.

32
user3176971

Vous ne pouvez pas référencer le résultat d'une fonction d'agrégat (par exemple MAX ()) dans une clause WHERE de la même requête.

Le modèle normatif pour résoudre ce type de problème consiste à utiliser une vue intégrée, comme ceci:

SELECT t.firstName
     , t.Lastname
     , t.id
  FROM mytable t
  JOIN ( SELECT MAX(mx.id) AS max_id
           FROM mytable mx
       ) m
    ON m.max_id = t.id

Ce n'est qu'un moyen d'obtenir le résultat spécifié. Il existe plusieurs autres approches pour obtenir le même résultat, et certaines d'entre elles peuvent être beaucoup moins efficaces que d'autres. D'autres réponses démontrent cette approche:

 WHERE t.id = (SELECT MAX(id) FROM ... )

Parfois, l’approche la plus simple consiste à utiliser un ORDER BY avec un LIMIT. (Notez que cette syntaxe est spécifique à MySQL)

SELECT t.firstName
     , t.Lastname
     , t.id
  FROM mytable t
 ORDER BY t.id DESC
 LIMIT 1

Notez que cela ne renverra qu'une seule ligne; ainsi, s'il y a plus d'une ligne avec la même valeur id, cela ne les retournera pas toutes. (La première requête renverra TOUTES les lignes ayant la même valeur id.)

Cette approche peut être étendue pour obtenir plus d'une ligne. Vous pouvez obtenir les cinq lignes qui ont les valeurs id les plus élevées en le changeant en LIMIT 5.

Notez que la performance de cette approche dépend en particulier de la disponibilité d'un index approprié (c'est-à-dire avec id en tant que PRIMARY KEY ou en tant que colonne principale d'un autre index.) Un index approprié améliorera les performances des requêtes utilisant tous ces éléments. approches.

45
spencer7593

Utilisez une sous-sélection:

SELECT row  FROM table  WHERE id=(
    SELECT max(id) FROM table
)

Remarque: l'ID doit être unique, sinon plusieurs lignes sont renvoyées.

13
Fabian Bigler
SELECT firstName, Lastname, MAX(id) as max WHERE YOUR_CONDITIONS_HERE HAVING id=max(id) 
5
Hemanathagiribabu

Certaines versions de Mysql interdisent la "limite" à l'intérieur d'une sous-sélection. Ma réponse à vous (et à moi à l'avenir) serait d'utiliser des groupes

select firstName,Lastname,id 
where {whatever}
group by id
having max(id)

Cela vous permet de retourner ce que vous voulez dans la zone sélectionnée, sans avoir de champ agrégé.

4
jasonseminara

Voulez-vous le nom et le prénom de la ligne avec le plus grand id?

Si oui (et il vous manquait une clause FROM):

SELECT firstname, lastname, id
FROM foo
ORDER BY id DESC
LIMIT 1;
2
AgRizzo

Cette requête devrait vous rendre les données que vous souhaitez. Remplacez foo par le nom de la table que vous utilisez.

Requête SQL:

select firstName,Lastname, id 
from foo 
having max(id) = id 
2
michael.moyer

La syntaxe que vous avez utilisée est incorrecte. La requête devrait être quelque chose comme:

SELECT column_name(s) FROM tablename WHERE id = (SELECT MAX(id) FROM tablename)
2
ucsunil