我正在创建一个论坛,并且在创建将显示给定论坛的所有主题的页面时遇到了困难。三个相关表和字段的结构如下:

Table: forums_topics    Table: forums_posts    Table: users
--------------------    -------------------    ------------
int id                  int id                 int id
int forum_id            int topic_id           varchar name
int creator             int poster
tinyint sticky          varchar subject
                        timestamp posted_on

我已经开始使用以下 SQL:
   SELECT t.id,
          t.sticky,
          u.name AS creator,
          p.subject,
          COUNT(p.id) AS posts,
          MAX(p.posted_on) AS last_post
     FROM forums_topics AS t
     JOIN users AS u
LEFT JOIN forums_posts AS p ON p.topic_id = t.id
    WHERE t.forum_id = 1
      AND u.id = t.creator
 GROUP BY t.id
 ORDER BY t.sticky

这似乎让我得到了我想要的东西(主题的 id 号,如果它是粘性的,主题是谁,主题的主题,每个主题的帖子数,以及最新帖子的时间戳)。如果有错误,请告诉我。

我现在遇到的问题是如何添加此内容以获取最新海报的名称。有人可以解释我将如何编辑我的 SQL 来做到这一点吗?如果需要,我可以提供更多详细信息,或者重组我的表格,如果这会使事情变得更简单。

最佳答案

这是一个简单的方法来做到这一点:

SELECT t.id,
      t.sticky,
      u.name AS creator,
      p.subject,
      COUNT(p.id) AS posts,
      MAX(p.posted_on) AS last_post,
      (SELECT name FROM users
       JOIN forums_posts ON forums_posts.poster = users.id
       WHERE forums_posts.id = MAX(p.id)) AS LastPoster
 FROM forums_topics AS t
 JOIN users AS u
LEFT JOIN forums_posts AS p ON p.topic_id = t.id
WHERE t.forum_id = 1
  AND u.id = t.creator
GROUP BY t.id
ORDER BY t.sticky

基本上,您执行子查询以根据最大 id 查找用户。如果您的 ID 是 GUID 或由于其他原因不符合顺序,您可以根据 post_on 时间戳进行查找。

关于mysql - 有点复杂的 MySQL 语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5971730/

10-09 23:09
查看更多