所以我正在努力建立一个简单的论坛。它将按主题(如果没有回复)或最新回复的日期降序排列。这是数据库结构:
的主题
id, subject, date, poster
帖子
id, topic_id, message, date, poster
论坛本身将包含一个带有以下标题的HTML表格:
Topic | Last Post | Replies
查询或查询生成这样的结构会是什么样的?我以为它会涉及交叉加入,但不确定......提前谢谢。
答案 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
如果您希望其他内容与上一个发布日期一起显示,例如id
或poster
,则会更加复杂。
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
作为一个例子,我已经为主题添加了不同海报的数量,以向您展示这种方法可以扩展的位置。
查询依赖于以下假设:一个主题中没有两个帖子可以具有相同的日期。如果您希望这种情况发生,则必须更改查询以解决此问题。