MySQL简单论坛

时间:2009-01-03 16:35:07

标签: php sql mysql forum

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

forum_topic

  

ID,姓名,电子邮件,正文,日期

forum_reply

  

id,电子邮件,正文,日期,topic_id

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

  

主题,上次修改,#回复

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

4 个答案:

答案 0 :(得分:3)

有点像这样:

select * from forum_topic
inner join forum_reply on forum_topic.id=topc_id

但是,请勿使用select *

这是不好的做法:)

我不喜欢你避免正常化的方式!意思是我宁愿拥有:

用户

  • 用户ID
  • 名称
  • 电子邮件

<强>线程

  • 线程ID
  • 主题
  • 回答
  • AskedByUserID
  • 日期

<强>回复

  • ReplyID
  • 线程ID
  • 用户ID
  • 答案
  • 日期

然后选择这样的线程:

select ThreadID, Subject, Answered, AksedByUserID, Date from Threads

选择所有这样的回复

select Answer, Date, Name, Email from Threads
inner join Replies on Threads,ThreaID=Replies.ThreadID
inner join Users on AskedByUserID=UserID 
where Threads.ThreadID=xxx

现在这只是从头顶写的,但您可能还需要添加一些组。

答案 1 :(得分:1)

是的,你应该能够通过这样的查询得到它:

SELECT 
  forum_topic.id, 
  forum_topic.name AS Topic,  
  MAX(forum_reply.date) AS Last_Modified, 
  count(*) AS  Replies
FROM forum_topic 
INNER JOIN forum_reply ON (forum_topic.id=forum_reply.topic_id)
GROUP BY forum_topic.id

“分组依据”是为每个主题提供一行的魔力,MAX()COUNT()函数为我们提供了所需的汇总数据。

(编辑:我错过了第一篇文章的正文在主题表中,所以上面的查询将错过没有回复的帖子。菲利普有正确的想法建议你规范化你的数据。一旦标准化,类似上面的查询将为您提供所需的数据。

答案 2 :(得分:1)

首先,在我看来,noboody实际上回答了你的问题,即:

  

查询或查询会产生这样的结构是什么样的?

请求

的结构

主题,LastModified,#回复。

在给定您提供的表结构的情况下,生成具有该结构的结果表的SQL将是:

SELECT t.Id, t.Name AS Topic, 
       MAX(r.Date) AS LastModified, 
       COUNT(*) AS NumReplies
FROM Forum_Topic t
LEFT OUTER JOIN Forum_Reply r ON t.id = r.topic_id
GROUP BY t.Id, t.Name

(抱歉,这只在SQL Server上测试过,因为我目前无法访问MySql)

此外,您的结构 IS 已经标准化。相反的建议是假设您想要做什么,例如,假设您有兴趣跟踪添加中的用户名到电子邮件地址。这是非常合理的,但仍然是一个假设。从标准化的角度来看,使用电子邮件地址作为唯一的用户标识符没有任何错误。

现在,如果您正在寻找有关如何设置数据库的一般建议,我们可以为您提供很多建议。在规范化之前,我首先不使用潜在的关键字作为对象名称(例如,不要给出像'Name'和'Date'这样的列名。)

关于Matt关于当没有回复时值为NULL的注释:使用COALESCE()函数将解决这个问题。 COALESCE()返回第一个非NULL参数(如果所有参数都为NULL,则返回NULL)。所以用MAX(COALESCE(r.Date,t.Date))替换MAX(r.Date)。

答案 3 :(得分:0)

通过“规范化”,你的意思是应该删除“forum_topic”的正文栏,而实际的主题正文应该是第一个回复吗?