2012-09-03 12 views
11

In MySql è possibile utilizzare la funzione MAX() per ottenere il valore più alto quando si utilizza GROUP BY, come posso fare la stessa cosa per ottenere la stringa di testo più lunga? tavoloCome posso selezionare il campo di testo più lungo quando si utilizza GROUP BY in mysql, a la MAX()?

Esempio:

id_|_post_id|_title__________|_body_____________________________________________ 
1 | ZXBF1J | Favorite Color | My favorite color is blue. 
2 | ZXBF1J | Favorite Color | My favorite color is blue, no wait... 
3 | ZXBF1J | Favorite Color | My favorite color is blue, no wait, yelloooow! 
4 | AR3D47 | Quest   | To seek.. 
5 | AR3D47 | Quest   | To seek the Holy 
6 | AR3D47 | Quest   | To seek the Holy Grail. 

La parte difficile è che voglio ORDER BY id ASC vedere le voci meno recenti sulla parte superiore, e voglio gruppo dal post_id, che non è qualcosa che posso usare per ORDER e ottieni il tempo più lungo body.

Query di esempio:

SELECT post_id, title, MAX(body) // obviously MAX() doesn't work here 
FROM posts 
GROUP BY post_id 
ORDER BY id ASC 

uscita desiderata:

post_id|_title__________|_body_____________________________________________ 
ZXBF1J | Favorite Color | My favorite color is blue, no wait, yelloooow! 
AR3D47 | Quest   | To seek the Holy Grail. 

nuovamente il tasto è selezionare il più lungo body pur mantenendo l'ordine basato sulla id.

risposta

12

È necessario utilizzare CHAR_LENGTH invece di LENGTH

SELECT a.id, a.post_id, a.body 
FROM posts a INNER JOIN 
(
    SELECT post_ID, title, MAX(CHAR_LENGTH(body)) totalLength 
    FROM posts 
    GROUP BY post_ID, title 
) b ON a.post_id = b.post_ID AND 
     a.title = b.title AND 
     CHAR_LENGTH(a.body) = b.totalLength 

Si potrebbe desiderare di vedere la differenza: CHAR_LENGTH() vs LENGTH()

SQLFiddle Demo

+1

Immagino che tu vinca dato che il tuo CHAR_LENGTH sembra essere migliore per i set di caratteri non latini – cwd

5
select p.post_id, p.title, p.body 
from posts p 
inner join (
    select post_id, max(length(body)) as MaxLength 
    from posts 
    group by post_id 
) pm on p.post_id = pm.post_id and length(p.body) = MaxLength 
order by p.id 

SQL Fiddle Example

+0

SQL Fiddle - bello. non lo sapevo. – cwd