在mysql中使用GROUP BY时,如何选择最长的文本字段,即MAX MAX()?

cwd*_*cwd 11 mysql sql group-by

在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.
Run Code Online (Sandbox Code Playgroud)

棘手的部分是我想要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
Run Code Online (Sandbox Code Playgroud)

期望的输出:

post_id|_title__________|_body_____________________________________________
ZXBF1J | Favorite Color | My favorite color is blue, no wait, yelloooow!
AR3D47 | Quest          | To seek the Holy Grail.
Run Code Online (Sandbox Code Playgroud)

同样,关键是选择最长的,body同时维持基于的顺序id.

Joh*_*Woo 12

你需要使用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
Run Code Online (Sandbox Code Playgroud)

您可能希望看到差异:CHAR_LENGTH()vs LENGTH()

SQLFiddle演示


Red*_*ter 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 
Run Code Online (Sandbox Code Playgroud)

SQL小提琴示例