2012-04-29 12 views
0

私はこのような 'posts'テーブル(id、theme、title、content、created)を持つブログSQLシステムを持っています。SQL:各テーマの最後の3つの記事を取得

各投稿テーマの最後の3タイトルをテーブルに表示したいのですが、私はそれを取得しませんでした。

私は、このSQLコードを試みた:

SELECT * 
FROM posts 
GROUP BY theme 
ORDER BY created DESC 
LIMIT 0,3 

をしかし、これは私のテーブルの最後の3つのポストを与えます!

私を助けてもらえますか?

ありがとうございます。

+0

最後の3タイトルはどういう意味ですか?このテーブルに結合された別のテーブルがありますか?もしそうなら、その構造を投稿する。 –

+0

''作成された '' datetime'フィールドですか?あるいは単に 'datetime'値の文字列表現ですか? –

+0

実際には、SQLタイムスタンプ値タイプが作成されます。 – htaidirt

答えて

0

Josvicザミットの答えは(私から+1)右の部分であるが、あなたは、テーマごとにクエリを実行する必要はありません。これはMySQLで行うことができる方法ですが、PHPなどで「テーマごとのクエリを実行する」方が簡単になるでしょう。

SELECT * FROM 
(
SELECT 
IF(@prev != sq.theme, @rownum:=1, @rownum:[email protected] + 1) AS rownumber, @prev:=sq.theme, sq.* 
FROM 
(
    SELECT 
    * 
    FROM 
    posts 
    , (SELECT @rownum:=0, @prev:=0) r 
    ORDER BY theme, created DESC 
) sq 
) q 
WHERE q.rownumber <= 3 

残念ながら今はテストできませんが、動作するはずです。また、このクエリは、テーマごとにより簡単なクエリを実行するよりも時間がかかることに注意してください。

+0

お返事ありがとうございますtombom。確かに、私はあなたのコードを試して、それは動作します!私はたくさんの行を持っていないので、今すぐあなたのソリューションを実装しますが、確かに、行数が増えると、Josvic Zammitのコードを使いやすさとスピードに使います。再度、感謝します! – htaidirt

2

あなたは正しい部分をしていますが、他の部分ではGROUP BY節の使用を理解していません。

上記のLIMITは、クエリ結果全体に作用します。あなたには、GROUP BYが適用されるための集計関数が必要です。 SUMAVGなどです。単にSELECT *とグループ化を期待することはできませんtheme

GROUP BYは、グループ化するアイテムごとに1行を返します。たとえば、最新ので、3行ではありません。

したがって、テーマごとにというクエリを実行する必要があります。あなたはグループ化していますが、この場合はグループ化する必要はありません。必要なテーマごとにこのクエリを実行するループを書く:

SELECT * 
FROM posts 
WHERE theme = "your-theme" 
ORDER BY created DESC 
LIMIT 0,3 
+0

「GROUP BY」についての答えと説明をありがとう。実際、 'LIMIT'を指定しないと、すべての投稿テーマの最後の投稿が得られます。 – htaidirt

+0

@Hassinusよろしくお願いします。 –

関連する問題