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说的那样做,但我会保存这段代码。在仔细的基准测试告诉您需要这样做之前,先进行反规范化是过早优化的一个例子。