Comment sélectionner la `` chaîne '' la plus longue d'une table lors du regroupement

90

Exemple:

SELECT partnumber, manufacturer, condition, SUM(qty), AVG(price), description FROM parts

WHERE [something]

GROUP BY partnumber, manufacturer, condition

J'ai quelques descriptions qui sont vides, et il peut y avoir beaucoup de numéro de pièce, de fabricant, de valeurs de condition, et sur le groupe, il semble prendre la première description disponible, qui peut être vide. J'aimerais obtenir la description la plus longue disponible.

j'ai essayé ceci:

MAX(LENGTH(description)) 

cependant, cela renvoie le nombre de caractères dans la chaîne. Est-il possible de faire ce que j'essaie de faire dans MySQL?

user1336827
la source

Réponses:

181

Essayez ORDER BY LENGTH(description) DESCet utilisez LIMIT 1pour obtenir uniquement le plus grand.

StilesCrisis
la source
25
ORDER BY LENGTH(description) DESC LIMIT 1

Cela triera les résultats du plus long au plus court et donnera le premier résultat (le plus long).

Scott Nelson
la source
3
SELECT   partnumber, manufacturer, `condition`, SUM(qty), AVG(price), description
FROM     parts
WHERE    [something] AND LENGTH(description) = (
           SELECT MAX(LENGTH(description))
           FROM   parts AS p
           WHERE  p.partnumber   = parts.partnumber
              AND p.manufacturer = parts.manufacturer
              AND p.condition    = parts.condition
         )
GROUP BY partnumber, manufacturer, `condition`
Eggyal
la source
Cela me semble «coûteux», en temps d'exécution et en code écrit, pour la sélection d'un enregistrement. Je ne pense pas qu'une sous-requête soit le meilleur moyen de gérer le problème.
MJH
1
@rosa: vous avez raison sur la verbosité, même si je ne suis pas sûr que le temps de performance soit très différent (cela et ORDER BY nécessitent un tri de fichiers). L'avantage de cette version est qu'elle renvoie tous les enregistrements de longueur maximale, pas seulement un seul indéterminé.
eggyal
@rosa: aussi, en repensant à cette question, je pense que j'ai cru comprendre que l'OP voulait obtenir la plus longue chaîne de chaque groupe, plutôt que le résultat le plus long dans l'ensemble.
eggyal
0

Il semble que j'ai répondu à ma propre question, MAX (description) semble fonctionner très bien.

user1336827
la source
7
Cela ne vous donnera pas la description la plus longue , plutôt la description qui est le maximum lexical (c'est-à-dire dans un ordre alphabétique). Cependant, comme cet ordre placera toute description non vide après les descriptions vides, il en résultera toujours une description non vide s'il en existe une: peut-être est-ce suffisant pour vos besoins?
eggyal
0

MAX (LENGTH (description)) renvoie la longueur de la valeur la plus longue dans la colonne Description.

Tushar Kesare
la source