12

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です。

4

2 に答える 2

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

CHAR_LENGTH()とLENGTH()の違いを確認することをお勧めします。

SQLFiddleデモ

于 2012-09-03T15:25:58.917 に答える
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フィドルの例

于 2012-09-03T15:25:13.683 に答える