Como seleciono a 'string' mais longa de uma tabela ao agrupar

90

Exemplo:

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

WHERE [something]

GROUP BY partnumber, manufacturer, condition

Tenho algumas descrições que estão em branco e pode haver muitos números de peça, fabricante, valores de condição e no grupo parece que a primeira descrição disponível, que pode estar em branco. Eu gostaria de obter a descrição mais longa disponível.

eu tentei isso:

MAX(LENGTH(description)) 

no entanto, isso retorna o número de caracteres na string. É possível fazer o que estou tentando fazer no MySQL?

user1336827
fonte

Respostas:

181

Experimente ORDER BY LENGTH(description) DESCe use LIMIT 1para obter apenas o maior.

StilesCrisis
fonte
25
ORDER BY LENGTH(description) DESC LIMIT 1

Isso classificará os resultados do mais longo para o mais curto e dará o primeiro resultado (o mais longo).

Scott Nelson
fonte
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
fonte
Isso me parece 'caro', em tempo de execução e código escrito, para a seleção de um registro. Não acho que uma subconsulta seja a melhor maneira de lidar com o problema.
MJH
1
@rosa: você está certo sobre o detalhamento, embora eu não tenha certeza de que o tempo de desempenho seria muito diferente (tanto este quanto o ORDER BY requerem filesort). A vantagem dessa versão é que ela retorna todos os registros de comprimento máximo, não apenas um único indeterminado.
Eggyal
@rosa: também, olhando para trás, para esta questão, acho que meu entendimento foi que o OP queria obter a sequência mais longa em cada grupo, ao invés do resultado mais longo em geral.
Eggyal
0

Parece que respondi minha própria pergunta, MAX (descrição) parece funcionar muito bem.

user1336827
fonte
7
Isso não fornecerá a descrição mais longa , mas sim a descrição que é o máximo léxico (ou seja, em ordem alfabética). No entanto, como essa ordem colocará qualquer descrição não vazia após as vazias, sempre resultará em uma descrição não vazia, se houver: talvez isso seja suficiente para suas necessidades?
Eggyal
0

MAX (LENGTH (descrição)) retorna o comprimento do valor mais longo na coluna Descrição.

Tushar Kesare
fonte