题
所以我试图建立一个简单的论坛。这将是一个议题清单中的顺序由日的主题(如果没有答复)或最新的答复。这里的数据库的结构:
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”的主体列。应该删除,实际的主题正文应该是第一个回复吗?