MySQL groupwise máximo pelo comprimento de um campo
-
11-12-2019 - |
Pergunta
Product
mesa:
id: int
name: varchar(255)
info: varchar(8000)
Preciso obter uma lista de todos os produtos, agrupados por nome, e se alguns produtos tiverem o mesmo nome, então aquele com mais dados info
campo deve ser escolhido para mostrar.Outro requisito é a consistência - deve-se garantir que os mesmos produtos sejam exibidos sempre.Mas o desempenho não é minha preocupação com isso.
Então o melhor que consegui até agora foi o seguinte:
select * from (select * from product order by length(info) desc) as product group by name
Meu entendimento de que isso deve funciona no MySQL mas não garante os resultados.
Existe alguma maneira melhor?
ATUALIZAR:
Um exemplo do que procuro.Se os dados forem
1, 'Product1', '12345'
2, 'Product1', '123'
3, 'Product2', '123456'
4, 'Product2', '123456'
5, 'Product2', '12'
Os resultados esperados devem ser:
1, 'Product1', '12345'
3, 'Product2', '123456'
ou
1, 'Product1', '12345'
4, 'Product2', '123456'
Não me importa qual dos dois, desde que seja o mesmo resultado sempre que executo a consulta.
Solução
Acho que você precisa fazer uma junção:
select p.*
from product p join
(select p.name, max(len(info)) as maxinfolen
from product p
group by p.name
) t
on p.name = t.name and
len(p.info) = t.maxinfolen
Isso retornará duplicatas, se o comprimento máximo for repetido em info.Para eliminar duplicatas, você pode agrupar externamente:
select p.name, max(info)
from product p join
(select p.name, max(len(info)) as maxinfolen
from product p
group by p.name
) t
on p.name = t.name and
len(p.info) = t.maxinfolen
group by p.name
Se você está tentando escolher sempre o mesmo ID, você pode usar a mesma ideia:
select p.*
from product p join
(select p.name, min(id) as minid
from product p join
(select p.name, max(len(info)) as maxinfolen
from product p
group by p.name
) t
on p.name = t.name and
len(p.info) = t.maxinfolen
group by p.name
) t
on p.name = t.name and
p.id = t.minid