0

Web ページで、フォーラム (parent_id = 0) のリストを表示し、各フォーラムについて、そのフォーラムとそのサブフォーラムのグループ内の最新 (最新) の 3 つのトピックを表示したいと考えています。

APPLE (Forum)
 iPad3        Apr 12   (Topic from subForum "Tablets")
 Genius Bar   Apr 11   (Topic from Forum "APPLE")
 iPodNano     Apr 10   (Topic from subForum "Portables")
repeat with next forum

MySQL 5.5 の構造

table FORUMS (contains Forums and subForums, 2 level hierarchy max)
 id (autoinc)
 parent_id (0 if Forum, link to other rows id if subForum)
 name


table TOPICS (a Topic is a child of Forums or subForums)
 id (autoinc)
 forum_id (linked to FORUMS table
 name
 date_added (datetime)

単純なクエリからフォーラムの結果セットを PHP の配列に取得し、それをループすることができます。

上位 3 つのトピックを表示する 2 番目の結果セットを作成する方法に行き詰まっています。

Greatest-N-Per-Group に関する投稿を読み、試してみましたが、私の考えでは複雑さが増すと思います。この時点で私の脳はどろどろなので、助けを求めています。

フォーラム ID とそのサブフォーラムの ID のコンマ区切りリストを保持する mysql 変数を作成し、それを IN (1, 4, 6) ステートメントの値として使用しますか?

それとも、これは悪い設計/アイデアであり、実行するには費用がかかりすぎますか?

私はSOに関する多くの関連記事を読みましたが、あなたが私を指し示すことができるリンクも読みます。

4

1 に答える 1

1

あなたの質問が明確でないため、私はいくつかの仮定をしなければなりませんでしたが、テーブル/フィールド名に合うようにこれを変更できるはずです。オーバーヘッドを削減するために、最も内側のクエリに日付に基づくフィルターを含めました。topics.date_added > (CURRENT_DATE - INTERVAL 1 MONTH)フォーラムグループごとに常に3つのエントリがあることを確認するために、基準を変更する必要がある場合があります-

SELECT *
FROM (
    SELECT
        tmp.*,
        @rank := IF(@forum=forum_id, @rank + 1, 1) rank, 
        @forum := forum_id
    FROM (
        SELECT
            forums.id AS forum_id,
            forums.name AS forum_name,
            NULL AS subforum_id,
            NULL AS subforum_name,
            topics.name AS topic_name,
            topics.date_added
        FROM forums
        INNER JOIN topics
            ON (forums.id = topics.forum_id)
        WHERE topics.date_added > (CURRENT_DATE - INTERVAL 1 MONTH)
        AND forums.parent_id = 0
        UNION ALL
        SELECT
            forums.id AS forum_id,
            forums.name AS forum_name,
            subforums.id AS subforum_id,
            subforums.id AS subforum_name,
            topics.name AS topic_name,
            topics.date_added
        FROM forums
        INNER JOIN forums subforums
            ON forums.id = subforums.parent_id
        INNER JOIN topics
            ON subforums.id = topics.forum_id
        WHERE topics.date_added > (CURRENT_DATE - INTERVAL 1 MONTH)
        AND forums.parent_id = 0
        ORDER BY forum_id ASC, date_added DESC
    ) tmp, (SELECT @forum:=NULL, @rank:=NULL) initvars
) tmp2
WHERE rank <= 3

注:これは試していませんので、構文エラーが発生する可能性があります。

于 2012-04-13T00:36:25.170 に答える