MySQL gruppenweise maximal durch die Länge eines Feldes
-
11-12-2019 - |
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.
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