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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top