4

MySQL をデータベースとして使用して PHP でプログラミングを始めたことがあります。基本的な SQL クエリから、最大 2 つのテーブルを含む単純な JOINS までを知っています。

しかし、3 つ以上のテーブルから結果を取得する必要がある瞬間に行き詰まります。どんなに頑張っても、どうにか道に迷ってしまいます。複雑な SQL クエリに取り組む方法に関する優れたチュートリアルを探してあらゆる場所を検索しましたが、その方法を説明するものは見つかりませんでした。ほとんどのチュートリアルは特定の問題の解決策で構成されていますが、問題に取り組むための完全な一般的な手順については説明していません。

複雑なクエリに関して、最初から最後までの基本的な一般的な方法、クエリの作成方法などを誰でも説明できますか。

例えば:

次のデータベース構造を持つフォーラムがあります。

フォーラムカテゴリー:

id | name | desc

フォーラムトピック:

id | category_id | created_on | created_by | title | content

フォーラムポスト:

id | topic_id | created_on | created_by

ユーザー:

id | first_name | last_name

すべてのトピックがforumTopicテーブルに作成されます。そのトピックへのすべての返信がforumPostテーブルに挿入されます。

ここで、フォーラムのメイン ページに、カテゴリ、特定のカテゴリのユーザーが最後に投稿した投稿、最後の投稿を投稿したユーザーを表示する必要があります。

私が考えた流れは:

  1. topic_id でグループ化された forumPost テーブルの MAX(id) を調べて、カテゴリの最後の投稿を見つけます。これにより、すべてのトピックの最後の投稿の ID が取得されます。

  2. ここで、category_id でグループ化された (以前に取得した IDS の) MAX を再度見つけます。これにより、すべてのカテゴリの最後の投稿が取得されます。

ID は自動インクリメントの主キーです。

しかし、上記のアルゴリズムからSQLクエリを作成することに行き詰まりました

誰かがこれについて私を助けることができれば非常に役に立ちます.

4

1 に答える 1

1

Post to Topicに参加して、各カテゴリの最後の投稿を取得します

SELECT category_id , category.name, Max(ForumPost.ID) as maxpostid
from ForumPost
inner join ForumTopic on ForumPost.Topic_ID = ForumTopic.ID
inner join ForumCategory on ForumTopic.Category_Id = ForumCategory.ID
group by category_Id, category.name

(これは説明のための中間段階です-以下のクエリに含まれています)

次に、これをユーザーテーブルに結合して、ユーザー名を確認します(おそらく、投稿にユーザーIDがありますか?)

select users.name, lastposts.*
from
    forumpost
inner join
    (
        SELECT category_id , category.name, Max(ForumPost.ID) as maxpostid
        from ForumPost
        inner join ForumTopic on ForumPost.Topic_ID = ForumTopic.ID
        inner join ForumCategory on ForumTopic.Category_Id = ForumCategory.ID
        group by category_Id, category.name
     ) lastposts
          on forumpost.id = lastposts.maxpostid
inner join
     users on forumpost.userid =users.id

ただし、投稿が行われるたびに、最後の投稿でカテゴリテーブルを更新することを検討することをお勧めします。そうすれば、フォーラムのフロントページに対してはるかに簡単なクエリを実行できます。

于 2012-07-20T08:17:05.017 に答える