Wie wähle ich beim Gruppieren die längste Zeichenfolge aus einer Tabelle aus?

90

Beispiel:

SELECT partnumber, manufacturer, condition, SUM(qty), AVG(price), description FROM parts

WHERE [something]

GROUP BY partnumber, manufacturer, condition

Ich habe einige Beschreibungen, die leer sind, und es kann viele Teilenummern, Hersteller und Bedingungswerte geben, und für die Gruppe scheint die erste verfügbare Beschreibung zu gelten, die leer sein kann. Ich möchte die längste verfügbare Beschreibung erhalten.

Ich habe es versucht:

MAX(LENGTH(description)) 

Dies gibt jedoch die Anzahl der Zeichen in der Zeichenfolge zurück. Ist es möglich, das zu tun, was ich in MySQL versuche?

user1336827
quelle

Antworten:

181

Versuchen Sie ORDER BY LENGTH(description) DESCund verwenden Sie, LIMIT 1um nur die größten zu bekommen.

StilesCrisis
quelle
25
ORDER BY LENGTH(description) DESC LIMIT 1

Dadurch werden die Ergebnisse vom längsten zum kürzesten sortiert und das erste Ergebnis (am längsten) erhalten.

Scott Nelson
quelle
3
SELECT   partnumber, manufacturer, `condition`, SUM(qty), AVG(price), description
FROM     parts
WHERE    [something] AND LENGTH(description) = (
           SELECT MAX(LENGTH(description))
           FROM   parts AS p
           WHERE  p.partnumber   = parts.partnumber
              AND p.manufacturer = parts.manufacturer
              AND p.condition    = parts.condition
         )
GROUP BY partnumber, manufacturer, `condition`
eggyal
quelle
Dies scheint mir in Bezug auf Laufzeit und geschriebenen Code für die Auswahl eines Datensatzes "teuer" zu sein. Ich denke nicht, dass eine Unterabfrage der beste Weg ist, um das Problem zu lösen.
MJH
1
@rosa: Sie haben Recht mit der Ausführlichkeit, obwohl ich nicht sicher bin, ob die Aufführungszeit sehr unterschiedlich sein würde (sowohl dies als auch ORDER BY erfordern eine Dateisortierung). Der Vorteil dieser Version ist, dass sie alle Datensätze maximaler Länge zurückgibt, nicht nur einen einzigen unbestimmten.
Eggyal
@rosa: Wenn ich auf diese Frage zurückblicke, denke ich, dass ich verstanden habe, dass das OP die längste Zeichenfolge in jeder Gruppe erhalten wollte und nicht das längste Ergebnis insgesamt.
Eggyal
0

Es scheint, als hätte ich meine eigene Frage beantwortet. MAX (Beschreibung) scheint gut zu funktionieren.

user1336827
quelle
7
Das gibt Ihnen nicht die längste Beschreibung, sondern die Beschreibung, die das lexikalische Maximum darstellt (dh in alphabetischer Reihenfolge). Da bei dieser Bestellung jedoch nicht leere Beschreibungen nach leeren platziert werden, wird immer eine nicht leere Beschreibung angezeigt, sofern eine vorhanden ist: Vielleicht reicht dies für Ihre Anforderungen aus?
Eggyal
0

MAX (LENGTH (description)) gibt die Länge des längsten Werts in der Spalte Description zurück.

Tushar Kesare
quelle