所以我试图建立一个简单的论坛。这将是一个议题清单中的顺序由日的主题(如果没有答复)或最新的答复。这里的数据库的结构:

forum_topic

id,name,电子邮件、身体、日期

forum_reply

id,电子邮件、身体、日期、topic_id

该论坛本身将包括一个HTML表格与以下标题:

主题,最后一次修改,#答复

会是什么样的查询,或查询看起来像产生这样的结构?我想这将涉及一个十字加入,但是不确定...在此先感谢。

有帮助吗?

解决方案

首先,在我看来,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)。

其他提示

有点像这样:

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

然而,不用 select *

这是不好的做法:)

我不喜欢你的方式避免正常化!这意味着我将不具有:

用户

  • UserID
  • 名称
  • 电子邮件

螺纹

  • 回答
  • AskedByUserID
  • 日期

答复

  • ReplyID
  • UserID
  • 答案
  • 日期

然后选择一个线程是这样的:

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

现在这只是书面从我的头顶,但可能需要添加一些集团通过。

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

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

“group by”是一个魔术,每个主题给我们一行, MAX() COUNT()函数为我们提供您需要的汇总数据。

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

通过“标准化”,您指的是“forum_topic”的主体列。应该删除,实际的主题正文应该是第一个回复吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top