2

Web プロジェクトのカスタム フォーラムに取り組んでいます。ID を持つカテゴリ、ID とカテゴリを持つトピック、ID とトピックとユーザー ID を持つ投稿があります。私がやろうとしているのは、そのカテゴリの最新の投稿の投稿テーブルのデータ、その投稿に関連付けられているユーザーのデータ、およびトピックのデータとともに、カテゴリ テーブルのデータを含むカテゴリのリストを表示することです。その最新の投稿に関連付けられています。

私はクエリを理解しようとして頭を悩ませてきましたが、複雑な mysql クエリを十分に理解していないため、ここで使用するパターンや手法を知ることができません。これが私がこれまでに持っているものです:

SELECT u1.*, fp1.*, ft1.*, fc1.* from forum_posts AS fp1
LEFT JOIN users AS u1 ON u1.id = fp1.post_by
LEFT JOIN forum_topics AS ft1 on ft1.id = fp1.post_topic
LEFT JOIN forum_categories AS fc1 on fc1.id = ft1.topic_cat
GROUP BY fc1.id
ORDER BY fp1.id ASC;

しかし、これは私が探している結果を返しません。問題は、各カテゴリの最新の投稿とその投稿の関連トピックを取得しようとすることです。

各テーブルの DB 構造は次のとおりです。

フォーラム_カテゴリ

+-----------------+---------------------+------+-----+---------+----------------+
| Field           | Type                | Null | Key | Default | Extra          |
+-----------------+---------------------+------+-----+---------+----------------+
| id              | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| cat_name        | varchar(255)        | NO   | UNI | NULL    |                |
| cat_description | varchar(500)        | NO   |     | NULL    |                |
| cat_views       | bigint(20) unsigned | YES  |     | 0       |                |
| status          | tinyint(1)          | NO   |     | 1       |                |
+-----------------+---------------------+------+-----+---------+----------------+

フォーラム_トピック

+---------------+---------------------+------+-----+---------+----------------+
| Field         | Type                | Null | Key | Default | Extra          |
+---------------+---------------------+------+-----+---------+----------------+
| id            | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| topic_subject | varchar(255)        | NO   |     | NULL    |                |
| topic_date    | datetime            | NO   |     | NULL    |                |
| topic_cat     | bigint(20) unsigned | NO   | MUL | NULL    |                |
| topic_by      | bigint(20) unsigned | NO   | MUL | NULL    |                |
| topic_views   | bigint(20) unsigned | YES  |     | 0       |                |
+---------------+---------------------+------+-----+---------+----------------+

フォーラム投稿

+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| id           | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| post_content | text                | NO   |     | NULL    |                |
| post_date    | datetime            | NO   |     | NULL    |                |
| post_topic   | bigint(20) unsigned | NO   | MUL | NULL    |                |
| post_by      | bigint(20) unsigned | NO   | MUL | NULL    |                |
+--------------+---------------------+------+-----+---------+----------------+

ユーザー

+-----------+---------------------+------+-----+---------+----------------+
| Field     | Type                | Null | Key | Default | Extra          |
+-----------+---------------------+------+-----+---------+----------------+
| id        | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| user_type | varchar(50)         | YES  |     | NULL    |                |
| email     | varchar(255)        | NO   | UNI | NULL    |                |
| username  | varchar(255)        | YES  | UNI | NULL    |                |
| password  | char(60)            | NO   |     | NULL    |                |
| image     | text                | YES  |     | NULL    |                |
| status    | tinyint(1)          | NO   |     | 1       |                |
+-----------+---------------------+------+-----+---------+----------------+

これが私が達成しようとしている出力のイメージです。"Categories" には、forum_categories テーブルのデータが表示され、"Recent" の下には、最新の投稿のユーザー、投稿、およびトピックのデータが表示されます。

私が達成しようとしている出力

私を助けてください。ありがとうございました。

4

1 に答える 1

2

すべてのテーブルを結合して各投稿のトピック、カテゴリ、およびユーザーを計算するのは簡単ですが、追加の手順が 1 つ必要です。つまり、max(post_id)カテゴリごとを取得するサブクエリに結合する必要があります。

これを行う方法の 1 つを次に示します。

select fc.cat_name, fc.cat_description, fc.cat_views, u.username, fp.post_date, ft.topic_subject
  from forum_categories fc
    inner join forum_topics ft
      on fc.id = ft.topic_cat
    inner join forum_posts fp
      on fp.post_topic = ft.id
    inner join users u
      on fp.post_by = u.id
    inner join (
      select topic_cat, max(fp.id) most_recent_post
        from forum_topics ft
          inner join forum_posts fp
            on fp.post_topic = ft.id
      group by topic_cat
    ) q
      on q.topic_cat = ft.topic_cat
        and fp.id = q.most_recent_post;

ここでプレイできるデモがあります: http://sqlfiddle.com/#!9/3736b/1

于 2015-05-05T08:53:48.460 に答える