有点复杂的MySQL语句
我正在创建一个论坛,但在创建一个显示给定论坛所有主题的页面时遇到了困难。三个相关表格和字段的结构如下:有点复杂的MySQL语句,mysql,sql,aggregate-functions,Mysql,Sql,Aggregate Functions,我正在创建一个论坛,但在创建一个显示给定论坛所有主题的页面时遇到了困难。三个相关表格和字段的结构如下: Table: forums_topics Table: forums_posts Table: users -------------------- ------------------- ------------ int id int id int id int forum_id
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或由于其他原因不符合顺序,您可以根据发布的时间戳进行查找。这似乎可以做到这一点,非常感谢!当我在这里闲逛的时候,我也发现加入同一张桌子两次很有趣。这很有效,所以我将使用它并继续前进,但我会记下一条记录,回来重新查看它,看看是否可以在没有子选择的情况下完成它。