0

次のリレーショナルスキーマを持つデータベースがあると想像してください。

forums(id, title)
forum_topics(id, forum_id, title, count_views, some_data)
forum_posts(id, topic_id, title, content, author_id, another_data)

そして、forums_postsテーブルにデータを含む2つの行があるとします。

(1, 1, 'some title', 'some content', 4, 'blahr')
(2, 1, 'another post title', 'my content', 5, 'nah')

ここで、トピックID、そのトピックの投稿数、およびトピックへの最新の寄稿者のユーザーIDを提供するSQLステートメントを作成します。最初の2つの値を取得することは明らかに問題ではありませんが、後者はかなり注意が必要です。これが私がこれまでに持っているものです:

SELECT topic_id,
   COUNT(*) AS count_posts,
   forum_posts.author_id AS last_answer_by
FROM forum_posts
JOIN forum_topics ON forum_posts.topic_id = forum_topics.id
GROUP BY topic_id

上記のクエリは、id = 1のforum_topicsエントリがあると仮定すると、私に与えられます。

topic_id = 1
count_posts = 2
last_answer_by = 4

高い投稿IDは、低いIDの投稿エントリよりも後で書き込まれたことを意味しますが、取得したいのは次のとおりです。

topic_id = 1
count_posts = 2
last_answer_by = 5
4

2 に答える 2

2

必要な結果を取得するには、forum_postsテーブルに対してクエリを実行するだけですが、from句でサブクエリを使用して、forum_postsテーブルの各topic_idの投稿数のカウントと最大投稿IDを最初に取得する必要があります。トピック。次に、そのサブクエリの結果を、その最大投稿IDの元のforum_postsテーブルに結合します。

SELECT postcounts.topic_id,
       count_posts,
       author_id as last_answer_by
FROM
  (SELECT topic_id,
          COUNT(*) AS count_posts,
          MAX(id) AS lastpost
   FROM forum_posts
   GROUP BY topic_id) postcounts
INNER JOIN forum_posts ON lastpost = forum_posts.id
于 2013-02-02T02:11:59.747 に答える
0
SELECT  a.topic_id,
        b.autor_ID as Last_Answer_By,
        d.TotalCount
FROM    forum_topics b
        INNER JOIN forum_posts a
            ON a.topic_id = b.id
        INNER JOIN
        (
            SELECT  topic_ID, MAX(ID) max_ID
            FROM    forum_posts
            GROUP   BY topic_ID
        ) c ON  b.topic_ID = c.topic_ID AND
                b.ID = c.max_ID
        INNER JOIN
        (
            SELECT  topic_ID, COUNT(*) TotalCount
            FROM    forum_posts
            GROUP   BY topic_ID
        ) d ON  a.topic_ID = d.topic_ID
于 2013-02-02T01:56:36.993 に答える