Как выбрать длинное текстовое поле при использовании 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()
Ответ 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