MySQL en grupo máximo por la longitud de un campo
-
11-12-2019 - |
Pregunta
Product
mesa:
id: int
name: varchar(255)
info: varchar(8000)
Necesito obtener una lista de todos los productos, agrupados por nombre, y si algunos productos tienen el mismo nombre, entonces el que tiene más datos. info
El campo debe seleccionarse para mostrar.Otro requisito es la coherencia: se debe garantizar que se muestren siempre los mismos productos.Pero el rendimiento no es mi preocupación en absoluto con esto.
Así que lo mejor que se me ocurrió hasta ahora es esto:
select * from (select * from product order by length(info) desc) as product group by name
Mi entendimiento de que esto debería funciona en MySQL pero no garantiza los resultados.
¿Hay alguna forma mejor?
ACTUALIZAR:
Un ejemplo de lo que estoy buscando.Si los datos son
1, 'Product1', '12345'
2, 'Product1', '123'
3, 'Product2', '123456'
4, 'Product2', '123456'
5, 'Product2', '12'
Los resultados esperados deberían ser:
1, 'Product1', '12345'
3, 'Product2', '123456'
o
1, 'Product1', '12345'
4, 'Product2', '123456'
No me importa cuál de los dos siempre que sea el mismo resultado cada vez que ejecuto la consulta.
Solución
Creo que necesitas unirte:
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
Esto devolverá duplicados, si la longitud máxima se repite en info.Para eliminar duplicados, puedes agrupar por fuera:
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
Si intentas elegir la misma identificación cada vez, puedes usar la misma idea:
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