需要帮助加入

时间:2009-06-27 09:08:36

标签: sql mysql

所以我正在努力建立一个简单的论坛。它将按主题(如果没有回复)或最新回复的日期降序排列。这是数据库结构:

的主题
id, subject, date, poster

帖子
id, topic_id, message, date, poster

论坛本身将包含一个带有以下标题的HTML表格:
Topic | Last Post | Replies

查询或查询生成这样的结构会是什么样的?我以为它会涉及交叉加入,但不确定......提前谢谢。

3 个答案:

答案 0 :(得分:1)

当然你可以对此进行查询,但我建议你在主题表字段'回复'和'最后发表'中创建,然后在每个新帖子上更新它们。这可以真正提高您的数据库速度,而不是现在,但是您将拥有数千个主题的时间。

答案 1 :(得分:0)

SELECT *
FROM 
    `Topics`, 
    (
        SELECT *, COUNT(*) AS `replies`
        FROM `Posts`
        GROUP BY `Posts`.`topic_id`
        ORDER BY `Posts`.`date` DESC
    ) AS `TopicPosts`
WHERE `Topics`.`id` = `TopicPosts`.`topic_id` 
ORDER BY `Posts`.`date` DESC

这应该“应该”工作,或者几乎不工作,但我同意另一张海报,最好将这些数据存储在主题表中,原因有各种,即使它是重复的数据。

答案 2 :(得分:0)

  

论坛本身将由一个   带有以下标题的HTML表格:
  Topic | Last Post | Replies

如果“最后发布”是一个约会,那很简单。

SELECT
  t.id,
  t.subject,
  MAX(p.date) AS last_post,
  COUNT(p.id) AS count_replies
FROM 
  Topics t
  INNER JOIN Posts p ON p.topic_id = t.id
GROUP BY
  t.id,
  t.subject

如果您希望其他内容与上一个发布日期一起显示,例如idposter,则会更加复杂。

SELECT
  t.id,
  t.subject,
  aggregated.reply_count,
  aggregated.distinct_posters,
  last_post.id,
  last_post.date,
  last_post.poster
FROM 
  Topics t
  INNER JOIN (
    SELECT   topic_id,
             MAX(p.date) AS last_date,
             COUNT(p.id) AS reply_count,
             COUNT(DISTINCT poster) AS distinct_posters
    FROM     Posts
    GROUP BY topic_id
  ) AS aggregated ON aggregated.topic_id = t.id
  INNER JOIN Posts AS last_post ON p.date = aggregated.last_date

作为一个例子,我已经为主题添加了不同海报的数量,以向您展示这种方法可以扩展的位置。

查询依赖于以下假设:一个主题中没有两个帖子可以具有相同的日期。如果您希望这种情况发生,则必须更改查询以解决此问题。