2013-12-23 42 views
0

这可能是一个简单/特定的问题,但我真的需要帮助。我在SQL Server数据库中有两个表:EntryComment。我想显示评论数条目表。当评论被添加时,评论计数当然会增加。两个表被连接这样的: Comment.EntryId = Entry.Id评论Count on Entry Table(SQL查询)

Entry表:

CREATE TABLE [dbo].[Entry] (
    [Id]     INT   IDENTITY (1, 1) NOT NULL, 
    [Subject]    NVARCHAR (MAX) NOT NULL, 
    [Content]    NVARCHAR (MAX) NOT NULL, 
    [Type]    NVARCHAR (50) NOT NULL, 
    [SenderId]   NVARCHAR (50) NOT NULL, 
    [Date]    DATE   NOT NULL, 
    [Department]   NVARCHAR (50) NULL, 
    [Faculty]    NVARCHAR (50) NULL, 
    [ViewCount]   INT   DEFAULT ((0)) NOT NULL, 
    [SupportCount]  INT   DEFAULT ((0)) NOT NULL, 
    [CommentCount]  INT   DEFAULT ((0)) NOT NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

Comment表:

CREATE TABLE [dbo].[Comment] (
    [Id]    INT   IDENTITY (1, 1) NOT NULL, 
    [EntryId]   INT   NOT NULL, 
    [SenderId]   NVARCHAR (50) NOT NULL, 
    [Date]    DATETIME  NOT NULL, 
    [Content]   NVARCHAR (MAX) NOT NULL, 
    [SupportCount]  INT   NOT NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

我显示在代码隐藏在一个gridview的条目(C#)。问题是这个,我应该写什么来作为查询来最有效地做到这一点?感谢帮助。

+1

确实需要存储评论数量吗?为什么不写一个视图来计算它? – okrumnow

+0

如果看起来像CommentCount应该是Entry上的一个计算列,如果你真的希望它成为DB中的一列。 –

+0

我会说你需要从这个表中'SupportCount'和'CommentCount'删除这些列,因为它们违反了第三范式,即表中的一列只应该依赖于主键。一个'查看'应该做的工作 –

回答

3

试试这个:

select e.Id,e.date,count(*) as NumComments 
from Entry e 
join comment c on c.entryId=e.id 
group by e.id,e.date 

如果有可能是没有意见,请尝试以下

select e.Id,e.date,count(c.entryId) as NumComments 
from Entry e 
left join comment c on c.entryId=e.id 
group by e.id,e.date 
+0

谢谢,但我得到了一个错误:'列'e.Date'在选择列表无效,因为它不包含在聚合函数或GROUP BY子句.'和我需要显示日期。 – samet

+0

显示条目日期或评论日期?添加e.Date到SELECT和GROUP BY解决错误信息 – Sparky

+0

谢谢你解决了我的问题:) – samet

0

您可以使用左加入用于这一目的。请我更具体的你要在gridview

你们为什么要commentcount表(大多数表有一对多关系,我们没有使用),哪些字段。如果您将其保留在表格中,则每次发表评论时都必须更新entry表格。