¿Cómo selecciono la 'cadena' más larga de una tabla al agrupar

90

Ejemplo:

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

WHERE [something]

GROUP BY partnumber, manufacturer, condition

Tengo algunas descripciones que están en blanco, y puede haber muchos números de pieza, fabricante, valores de condición, y en el grupo parece tener la primera descripción disponible, que puede estar en blanco. Me gustaría obtener la descripción más larga disponible.

intenté esto:

MAX(LENGTH(description)) 

sin embargo, devuelve el número de caracteres de la cadena. ¿Es posible hacer lo que estoy tratando de hacer en MySQL?

usuario1336827
fuente

Respuestas:

182

Prueba ORDER BY LENGTH(description) DESCy usa LIMIT 1para obtener solo el más grande.

StilesCrisis
fuente
26
ORDER BY LENGTH(description) DESC LIMIT 1

Esto ordenará los resultados del más largo al más corto y dará el primer resultado (el más largo).

Scott Nelson
fuente
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
fuente
Esto me parece "caro", en tiempo de ejecución y código escrito, para la selección de un registro. No creo que una subconsulta sea la mejor manera de manejar el problema.
MJH
1
@rosa: tiene razón sobre la verbosidad, aunque no estoy seguro de que el tiempo de rendimiento sea muy diferente (tanto esto como ORDER BY requieren ordenación de archivos). La ventaja de esta versión es que devuelve todos los registros de longitud máxima, no solo uno indeterminado.
eggyal
@rosa: también, mirando hacia atrás sobre esta pregunta, creo que entendí que el OP quería obtener la cadena más larga en cada grupo, en lugar del resultado más largo en general.
Eggyal
1

MAX (LENGTH (descripción)) devuelve la longitud del valor más largo en la columna Descripción.

Tushar Kesare
fuente
0

Parece que respondí mi propia pregunta, MAX (descripción) parece funcionar bien.

usuario1336827
fuente
7
Eso no le dará la descripción más larga , sino la descripción que es el máximo léxico (es decir, en un orden alfabético). Sin embargo, dado que ese orden colocará cualquier descripción no vacía después de las vacías, siempre dará como resultado una descripción no vacía si existe una: ¿quizás esto sea suficiente para sus necesidades?
eggyal