2012-06-04 11 views
56

Esempio:Come faccio a selezionare la 'stringa' più lungo da una tabella in cui il raggruppamento

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

WHERE [something] 

GROUP BY partnumber, manufacturer, condition 

Ho alcune descrizioni che sono vuoto, e ci possono essere molti partnumber, produttore, valori di condizione, e sul gruppo sembra prendere la prima descrizione disponibile, che può essere vuota. Mi piacerebbe avere la descrizione più lunga disponibile.

ho provato questo:

MAX(LENGTH(description)) 

, tuttavia, che restituisce il numero di caratteri della stringa. È possibile fare ciò che sto cercando di fare in MySQL?

risposta

110

Provare ORDER BY LENGTH(description) DESC e utilizzare LIMIT 1 per ottenere solo il più grande.

0

Sembra che abbia risposto alla mia domanda, MAX (descrizione) sembra funzionare bene.

+6

che non vi darà la più lunga descrizione * *, piuttosto la descrizione che è la lessicale massimo (cioè in ordine alfabetico). Tuttavia, dal momento che quell'ordinamento inserirà una descrizione non vuota dopo quelle vuote, produrrà sempre una descrizione non vuota se ne esiste una: forse questo è sufficiente per le tue esigenze? – eggyal

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` 
+0

Questo mi sembra "costoso", in tempo di esecuzione e codice scritto, per la selezione di un record. Non penso che una sotto-query sia il modo migliore per gestire il problema. – MJH

+1

@rosa: hai ragione sulla verbosità, anche se non sono sicuro che il tempo di esecuzione sarebbe molto diverso (sia questo che ORDER BY richiedono filesort). Il vantaggio di questa versione è che restituisce tutti i record di lunghezza massima, non solo un singolo indeterminato. – eggyal

+0

@rosa: inoltre, ripensando a questa domanda, ritengo che l'OP volesse ottenere la stringa più lunga in ciascun gruppo, piuttosto che il risultato più lungo nel complesso. – eggyal

10
ORDER BY LENGTH(description) DESC LIMIT 1 

Ciò ordinerà i risultati di più lunga a breve e dare il primo risultato (la più lunga).

Problemi correlati