Как выбрать длинное текстовое поле при использовании GROUP BY в mysql, a la MAX()?

В MySql вы можете использовать функцию MAX() для получения максимального значения при использовании GROUP BY, как я могу сделать то же самое, чтобы получить самую длинную строку текста?

Пример таблицы:

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.

Сложная часть состоит в том, что я хочу ORDER BY id ASC видеть самые старые записи в верхней части, и я хочу сгруппировать по post_id, который не является чем-то, что я могу использовать для ORDER, и получить самый длинный body.

Пример запроса:

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

Требуемый вывод:

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

Снова ключ должен выбрать самый длинный body при сохранении порядка на основе id.

Ответ 1

Вам нужно использовать CHAR_LENGTH вместо 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

Вы можете увидеть разницу: CHAR_LENGTH() vs LENGTH()

SQLFiddle Demo

Ответ 2

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