所以我正在努力建立一个简单的论坛。它将按主题(如果没有回复)或最新回复的日期降序排列。这是数据库结构:
forum_topic
ID,姓名,电子邮件,正文,日期
forum_reply
id,电子邮件,正文,日期,topic_id
论坛本身将包含一个带有以下标题的HTML表格:
主题,上次修改,#回复
查询或查询生成这样的结构会是什么样的?我以为它会涉及交叉加入,但不确定......提前谢谢。
答案 0 :(得分:3)
有点像这样:
select * from forum_topic
inner join forum_reply on forum_topic.id=topc_id
但是,请勿使用select *
这是不好的做法:)
我不喜欢你避免正常化的方式!意思是我宁愿拥有:
用户强>
<强>线程强>
<强>回复强>
然后选择这样的线程:
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”的正文栏,而实际的主题正文应该是第一个回复吗?