Gruplama yaparken bir tablodan en uzun 'dizeyi' nasıl seçerim?


90

Misal:

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

WHERE [something]

GROUP BY partnumber, manufacturer, condition

Boş olan bazı açıklamalarım var ve birçok parça numarası, üretici, koşul değeri olabilir ve grupta boş bırakılabilecek ilk tanım mevcut görünüyor. Mevcut en uzun açıklamayı almak istiyorum.

bunu denedim:

MAX(LENGTH(description)) 

ancak bu, dizedeki karakter sayısını döndürür. MySQL'de yapmaya çalıştığım şeyi yapmak mümkün mü?

Yanıtlar:


182

Yalnızca en büyüğünü elde etmek için deneyin ORDER BY LENGTH(description) DESCve kullanın LIMIT 1.


26
ORDER BY LENGTH(description) DESC LIMIT 1

Bu, sonuçları en uzundan en kısaya doğru sıralayacak ve ilk sonucu (en uzun) verecektir.


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`

Bu bana çalışma süresi ve yazılı kod açısından bir kaydın seçimi için 'pahalı' geliyor. Sorunu çözmenin en iyi yolunun alt sorgu olduğunu düşünmüyorum.
MJH

1
@rosa: Ayrıntı konusunda haklısınız, ancak performans süresinin büyük ölçüde farklı olacağından emin değilim (hem bu hem de ORDER BY dosya sıralaması gerektirir). Bu sürümün avantajı, yalnızca belirsiz bir tek değil, maksimum uzunluktaki tüm kayıtları döndürmesidir.
eggyal

@rosa: Ayrıca, bu soruya dönüp baktığımda, OP'nin genel olarak en uzun sonuç yerine her grupta en uzun diziyi elde etmek istediğini anladığımı düşünüyorum.
eggyal

1

MAX (LENGTH (açıklama)), Açıklama sütunundaki en uzun değerin uzunluğunu döndürür.


0

Görünüşe göre kendi sorumu cevapladım, MAX (açıklama) gayet iyi çalışıyor gibi görünüyor.


7
Bu size en uzun tanımı vermeyecektir , bunun yerine sözlüksel maksimum olan tanımlamayı (yani alfabetik bir sıralamayla) verecektir . Bununla birlikte, bu sıralama boş olmayan tanımlamaları boş olanlardan sonra yerleştireceğinden, eğer varsa bu her zaman boş olmayan bir tanımla sonuçlanacaktır: belki bu sizin ihtiyaçlarınız için yeterlidir?
eggyal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.