Fonction MAX dans la clause où mysql

Comment puis-je 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;

ce qui me donne une erreur:

Unknown column 'max' in 'where clause'

Toute Aide? Merci à l'avance.

27
demandé sur Bill Karwin 2014-03-20 19:50:54

8 réponses

vous ne pouvez pas référencer le résultat d'une fonction agrégée (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 est d'utiliser une ligne de vue, quelque chose 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'une façon 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émontrer ce approche:

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

parfois, l'approche la plus simple est d'utiliser un ordre avec une limite. (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 ceci ne retournera qu'une seule ligne; donc s'il y a plus d'une ligne avec la même valeur d'id, alors cela ne les retournera pas toutes. (La première requête renvoie TOUTES les lignes qui ont la même valeur d'id.)

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

notez que la performance de cette approche dépend particulièrement de la disponibilité d'un indice adéquat (c.-à-d. avec id comme clé primaire ou comme colonne principale dans un autre index.) Un index adéquat améliorera la performance des requêtes en utilisant toutes ces approches.

38
répondu spencer7593 2014-03-20 16:24:14

Utiliser 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 retournées

11
répondu Fabian Bigler 2017-01-02 19:33:24
SELECT firstName, Lastname, MAX(id) as max WHERE YOUR_CONDITIONS_HERE HAVING id=max(id) 
5
répondu Hemanathagiribabu 2016-10-22 09:13:21

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

SELECT column_name(s) FROM tablename WHERE id = (SELECT MAX(id) FROM tablename)
2
répondu ucsunil 2014-03-20 15:56:57

certaines versions Mysql refusent la 'limite' à l'intérieur d'un sous-select. Ma réponse à vous (et moi dans le futur) serait d'utiliser les groupes

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

cela vous permet de retourner tout ce que vous voulez dans la zone select, sans avoir de champ agrégé.

2
répondu jasonseminara 2015-05-13 18:30:16

voulez-vous le premier et le nom de famille de la rangée avec le plus grand id?

Si oui (et il vous manque une clause from):

SELECT firstname, lastname, id
FROM foo
ORDER BY id DESC
LIMIT 1;
1
répondu AgRizzo 2014-03-20 16:18:52

Cette requête devrait vous redonner 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 
0
répondu michael.moyer 2017-12-13 05:04:13

vous utilisez le mot 'max' comme alias pour votre colonne. Essayez d':

MAX(id) as mymax ... WHERE ID - mymax
-3
répondu bluszcz 2014-03-20 15:52:15