2011-05-11 53 views
4

我正在创建一个论坛,并且一直在创建一个页面,显示给定论坛的所有主题。这三个相关表格&领域的结构如下:有点复杂的MySQL声明

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来做到这一点?如果需要,我可以提供更多详细信息,或者如果这可以简化表格,我可以重新组织表格。

回答

1

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

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或者出于某种其他原因而不是其他原因,则可以根据posting_on时间戳进行查找。

+0

这似乎是做的伎俩,非常感谢你!在这里徘徊的同时,我也发现了两次加入同一张桌子的一些有趣的事情。这有效,所以我会使用它并继续前进,但是我会记录下来并重新访问,看看是否可以在没有子选择的情况下完成它。 – Geomancer 2011-05-14 00:54:55