フォースバーグ:
私が持っている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の古いバージョンを使用していて、これは動作しません。