2012-09-03 9 views
11

En MySql puede usar la función MAX() para obtener el valor más alto al usar GROUP BY, ¿cómo puedo hacer lo mismo para obtener la cadena de texto más larga? tabla¿Cómo puedo seleccionar el campo de texto más largo cuando uso GROUP BY en mysql, a la MAX()?

muestra:

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 difícil es que quiero ORDER BY id ASC para ver las entradas más antiguas en la parte superior, y quiero grupo por el post_id que no es algo que puedo utilizar para ORDER , y obtener el más largo body.

Consulta de ejemplo:

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

salida deseada:

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

Una vez más la clave está en seleccionar la más larga body mientras se mantiene el orden basado en la id.

Respuesta

12

Es necesario utilizar CHAR_LENGTH en lugar de 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 

Es posible que desee ver la diferencia: CHAR_LENGTH() vs LENGTH()

SQLFiddle Demo

+1

Supongo que ganas ya que tu CHAR_LENGTH parece ser mejor para los conjuntos de caracteres no latinos – 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 - agradable. no sabía sobre eso. – cwd