Question

Product tableau:

id: int
name: varchar(255)
info: varchar(8000)

J'ai besoin d'obtenir une liste de tous les produits, regroupés par son nom, et si certains produits ont le même nom, puis celui avec le plus de données dans info champ doit être choisi de montrer.Une autre exigence de cohérence - même les produits doivent être garantis pour être affiché à chaque fois.Mais la performance n'est pas ma préoccupation à toutes avec cette.

Alors le mieux que j'ai jusqu'à présent est ceci:

select * from (select * from product order by length(info) desc) as product group by name

Ma compréhension que cette devrait travailler dans MySQL, mais ne garantit pas les résultats.

Est-il un meilleur moyen?

Mise à JOUR:

Un exemple de ce que je suis à la recherche d'.Si les données sont

1, 'Product1', '12345'
2, 'Product1', '123'
3, 'Product2', '123456'
4, 'Product2', '123456'
5, 'Product2', '12'

Les résultats attendus doivent être soit:

1, 'Product1', '12345'
3, 'Product2', '123456'

ou

1, 'Product1', '12345'
4, 'Product2', '123456'

Je n'ai pas de soins où l'un des deux, tant que c'est le même résultat à chaque fois que j'exécute la requête.

Était-ce utile?

La solution

Je pense que vous avez besoin de faire une jointure:

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

Ce sera le retour de doublons, si la longueur maximale est répétée dans l'info.Afin d'éliminer les doublons, vous pouvez les regrouper par l'extérieur:

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 vous essayez de choisir le même id à chaque fois, vous pouvez utiliser la même idée:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top