Frage

Product Tisch:

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

Ich brauche eine Liste aller Produkte, gruppiert nach Namen, und wenn einige Produkte denselben Namen haben, dann das mit den meisten Daten info Das Feld sollte ausgewählt werden, um es anzuzeigen.Eine weitere Anforderung ist die Konsistenz – es sollte garantiert sein, dass jedes Mal die gleichen Produkte angezeigt werden.Aber die Leistung ist dabei überhaupt nicht mein Anliegen.

Das Beste, was mir bisher eingefallen ist, ist Folgendes:

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

Soweit ich weiß, ist dies der Fall sollen funktionieren in MySQL, garantieren jedoch nicht die Ergebnisse.

Gibt es einen besseren Weg?

AKTUALISIEREN:

Ein Beispiel dafür, was ich suche.Wenn die Daten sind

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

Die erwarteten Ergebnisse sollten entweder sein:

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

oder

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

Es ist mir egal, welches der beiden, solange es jedes Mal das gleiche Ergebnis ist, wenn ich die Abfrage ausführe.

War es hilfreich?

Lösung

Ich denke, Sie müssen einen Join durchführen:

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

Dadurch werden Duplikate zurückgegeben, wenn die maximale Länge in info wiederholt wird.Um Duplikate zu vermeiden, können Sie nach außen gruppieren:

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

Wenn Sie versuchen, jedes Mal dieselbe ID zu wählen, können Sie dieselbe Idee verwenden:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top