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