GROUP BYにORDERを適用する方法

フォースバーグ:

私が持っているarticle、それぞれが関連するカテゴリ持つ、テーブルを(分類されていない場合はNULLを-これらの記事は、この場合には、私の関心はありません)。

私は1つのカテゴリ(同じカテゴリからすなわち決して2件の記事)1つだけの記事が常に存在することのように一つのカテゴリから8件の最新記事ごとに取得したいです。

このクエリは、ほとんどの仕事:

SELECT article.id, article.title, category_container.title  FROM `article`
JOIN `category_container` ON category_container.id = article.category_id
WHERE `category_id` IS NOT NULL GROUP BY `category_id` ORDER BY article.created_at DESC LIMIT 8

問題は、ORDERは動作しませんされています。(それは反対である必要がありながら、最小のIDで)私は、最新欲しい、それが私の最も初期のものを返します。

だから、どのようにGROUP BYにORDERを適用するには?

ゴードン・リノフ:

あなたはしないでください。あなたのクエリが壊れている - とMySQLの最新バージョンでは、あなたが適切にエラーになるだろう。

代わりに使うフィルタリング最新の行を取得する方法を。ここで相関サブクエリを使用する方法は次のとおりです。

SELECT a.id, a.title, cc.title
FROM article a JOIN
     category_container cc
     ON cc.id = a.category_id
WHERE a.created_at = (SELECT MAX(a2.created_at)
                      FROM article a2
                      WHERE a2.category_id = a.category_id
                     )
ORDER BY a.created_at DESC
LIMIT 8;

パフォーマンスを得るために、あなたは上のインデックスをしたいですarticle(category_id, created_at)

最近のバージョンでは、これは使用してさらに簡単になりますROW_NUMBER()

SELECT a.id, a.title, cc.title
FROM (SELECT a.*,
             ROW_NUMBER() OVER (PARTITION BY a.category_id ORDER BY a.created_at DESC) as seqnum
      FROM article a
     ) a JOIN
     category_container cc
     ON cc.id = a.category_id
WHERE seqnum = 1;

あなたのクエリがエラーなしで実行されることを考えると、あなたはおそらくのMySQLの古いバージョンを使用していて、これは動作しません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=298669&siteId=1