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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top