0

このような「posts」テーブル(id、theme、title、content、created)を持つブログSQLシステムがあります。

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

私はこのSQLコードを試しました:

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

しかし、これは私にテーブルの最後の3つの投稿を与えます!!!

手伝ってくれませんか?

前もって感謝します。

4

2 に答える 2

2

あなたはいくつかの部分を正しく行っていますが、他の部分ではGROUP BY句の使用法を理解していません。

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

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

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

SELECT *
FROM posts
WHERE theme = "your-theme"
ORDER BY created DESC
LIMIT 0,3
于 2012-04-29T11:15:24.037 に答える
0

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

SELECT * FROM
(
SELECT
IF(@prev != sq.theme, @rownum:=1, @rownum:=@rownum + 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

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

于 2012-04-29T12:08:21.720 に答える