0
votes

MySQL max fonction mélange des rangées

J'ai la requête Sélectionnez ID, max (valeur) à partir de table1 et il renvoie la valeur correcte, mais il prend le premier identifiant de la table au lieu de celui correspondant à la valeur renvoyée (ID est la clé primaire). J'ai déjà vu des solutions, mais ils avaient tous besoin d'une clause où je ne peux pas utiliser dans mon cas.


2 commentaires

Pourquoi devrais-je fournir un exemple de reproductible minimal pour une requête SQL très simple?


Pensez-y, tout ID que vous sortiez de cette requête n'aura aucun sens. Vous acceptez un certain nombre de lignes afin que l'un des identifiants de l'une des lignes utilisées n'a pas de sens


3 Réponses :


0
votes

Je pense que vous avez oublié un groupe par clause:

SELECT id, MAX(value) 
FROM table1 
GROUP BY id
HAVING MAX(value) = (SELECT MAX(value) FROM table1)


2 commentaires

qui retourne plus de résultats que je le souhaite (il renvoie deux identifiants même s'il ne doit que renvoyer l'ID de valeur maximale réelle)


Voir mon édition (je n'ai pas utilisé où la clause comme vous l'avez dit que vous ne pouviez pas utiliser une pour quelque raison que ce soit)



1
votes

Je crois que ce que vous essayez de faire est de renvoyer l'identifiant de la ligne avec la valeur maximale. Est-ce correct?

Je suis curieux Pourquoi vous ne pouvez pas utiliser une clause où? P>

Mais d'accord, en utilisant cette contrainte, cela peut être résolu. Je vais supposer que votre table est unique sur ID (sinon, vous devriez vraiment parler à celui qui l'a construit et demandez pourquoi em>?) P>

SELECT id, max(value) as max_value
FROM table1
GROUP BY id
ORDER BY max_value DESC
LIMIT 1


2 commentaires

Semble mieux que ma solution, génial.


Ce sont des sortes non déterministes ("aléatoires") où n'importe quel enregistrement correspondant lorsque Valeur Les valeurs de colonne sont égales pourraient être la correspondance "première" que le résultat de l'enregistrement puisse changer sur chaque requête ... de toute façon il n'y a plus de chose comme le premier dans SQL, sans définir un tri déterministe (fixe) pour définir comment gérer les cravates que la pagination / le lot> Toujours nécessite un sens Utilisation de Commander par la valeur Desc, ID ASC / DESC Colonne d'identification d'asumation comportant un Primaire / unique KEY ..



1
votes

Premièrement, pour répondre à la raison pour laquelle votre requête se comporte de la manière dont vous observerez: je soupçonne que vous exécutez sans sql_mode = seulement_full_group_by code> car votre requête serait probablement génère une erreur sinon . Comme vous l'avez remarqué, cela peut conduire à des résultats quelque peu étranges.

Si seulement_full_group_by est désactivé, une extension MySQL à l'utilisation standard SQL de groupe en permet la sélection de la liste, la condition ou la commande par liste de se reporter à des colonnes non grotégées, même si les colonnes ne dépendent pas fonctionnellement du groupe par colonnes. Cela provoque que MySQL accepte la requête précédente. Dans ce cas, le serveur est libre de choisir n'importe quelle valeur de chaque groupe, de sorte qu'elles soient identiques, les valeurs choisies sont nondéterministes, ce qui n'est probablement pas ce que vous voulez. P> blockquote>

Dans ce cas, puisque vous n'avez pas de groupe de la clause code>, la table entière est effectivement du groupe. P>

Pour obtenir un identifiant associé à La plus grande valeur de la table, vous pouvez sélectionner toutes les lignes, commander par la valeur (décroissante), puis simplement limiter au premier résultat, pas besoin d'un opérateur d'agrégation (ou d'un où code> calus) : P>

SELECT id, value FROM table1 ORDER BY value DESC, id ASC LIMIT 1


6 commentaires

Vous semblez avoir complètement supprimé la fonction max () , était cette intensité


C'est vrai, j'ai, parce que ce n'est pas nécessaire. La commande par valeur dans un ordre décroissant aura le premier résultat soit une ligne avec la valeur maximale.


... Non ... @robsiember C'est ici que vous vous trompez .. Il s'agit d'une sorte non déterministe ("aléatoire") trier où n'importe quel enregistrement correspondant sur la valeur Valeurs de la colonne sont égaux pourraient être le "premier" , outre que le résultat d'enregistrement peut changer sur chaque demande.


Comme je l'ai noté, il vous donnera une ligne avec la valeur maximale, mais la question n'est pas claire si elle recherche une seule rangée ou toutes les lignes.


Quoi qu'il en soit, j'ai mal interprété un peu ce que vous vouliez dire de toute façon il n'y a plus de choses comme d'abord dans SQL, sans définir un tri déterministe (fixe) pour définir comment manipuler les cravates que la pagination / lots> Toujours nécessite un sens en utilisant Commander par la valeur Desc, ID ASC / DESC Colonne d'identification d'asumation ayant un Primaire / unique Clé ..


Merci, j'ai incorporé votre clarification, c'est utile.