Sql 需要帮助加入吗

Sql 需要帮助加入吗,sql,mysql,Sql,Mysql,所以我正试图建立一个简单的论坛。它将是一个主题列表,按主题(如果没有回复)或最新回复的日期降序排列。以下是数据库结构: 主题 id、主题、日期、海报 帖子 id、主题id、消息、日期、海报 论坛本身将由一个带有以下标题的HTML表组成: 主题|最后一篇文章|回复 生成这样一个结构的查询是什么样子的?我想这会涉及交叉连接,但不确定。。。提前感谢。当然您可以对此进行查询,但我建议您在主题表中创建“回复”和“最后一篇文章”字段,然后在每一篇新文章中更新它们。这真的可以提高数据库速度,不是现在,而是有数

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

主题
id、主题、日期、海报

帖子
id、主题id、消息、日期、海报

论坛本身将由一个带有以下标题的HTML表组成:
主题|最后一篇文章|回复


生成这样一个结构的查询是什么样子的?我想这会涉及交叉连接,但不确定。。。提前感谢。

当然您可以对此进行查询,但我建议您在主题表中创建“回复”和“最后一篇文章”字段,然后在每一篇新文章中更新它们。这真的可以提高数据库速度,不是现在,而是有数千个主题的时候

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
这个“应该”起作用,或者在它不起作用的情况下几乎起作用,但我同意另一张海报,出于各种原因,最好将这些数据存储在topics表中,即使是重复的数据

论坛本身将由一个 包含以下标题的HTML表格:
主题|最后一篇文章|回复

如果“最后一篇文章”是指约会,那很简单

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
如果您想在最后一次发布日期的同时显示其他内容,比如它的
id
海报
,它会变得更复杂一些

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
作为一个例子,我为一个主题添加了不同海报的数量,以向您展示这种方法可以扩展到哪里


该查询依赖于一个主题中的两篇文章不能有相同的日期这一假设。如果您希望发生这种情况,则必须更改查询以说明原因。

谢谢。我想我会像Thinker说的那样做,但我会保存这段代码。在仔细的基准测试告诉您需要这样做之前,先进行反规范化是过早优化的一个例子。