2014-03-04 22 views
2

我正在尝试为一个学校项目制作一个简单的论坛。 我在查询时遇到了一些麻烦。 我有3个表格,我正在尝试加入。 “类别”,“主题”和“发布”。来自多个连接表的COUNT行 - MSSQL

ERD

ERD

表数据

类别

Category

线程

Threads

帖子

Posts

(即使名称的拼写是在DB有点不同,在列和表是相同的,如所示的图像英寸) 只要我加入第二个表格(“帖子”),“线程”计数的结果是错误的。 如果我只留下连接并计算“线程”中的行数,那么结果是正确的。

当我这样做:

SELECT Category.Name AS CategoryName, Category.Description AS 
    CategoryDescription, COUNT(Threads.Id) AS NumberOfThreads 
    FROM Category 
    LEFT JOIN Threads ON Threads.FkCategoryId = Category.Id GROUP 
    BY Category.Name, Category.Description 

结果是

enter image description here

它返回 “主题” 行的实际数量。一切都很好,到目前为止, 但是当我添加第二个加入

SELECT Category.Name AS CategoryName, Category.Description AS CategoryDescription, 
    COUNT(Threads.Id) AS NumberOfThreads, 
    COUNT(Posts.Id) AS NumberOfPosts 
    FROM Category 
    LEFT JOIN Threads ON Threads.FkCategoryId = Category.Id 
    LEFT JOIN Posts ON Posts.FkThreadId = Threads.Id 
    GROUP BY Category.Name, Category.Description 

然后我得到这样的结果:

enter image description here

其中显示了“文章”既是“的实际行数主题“和”帖子“。

我也曾尝试多个查询在一个像这样的组合:

SELECT Category.Name AS CategoryName, Category.[Description] AS 
    CategoryDescription, COUNT(Threads.Id) AS NumberOfThreads 
    FROM Category 
    LEFT JOIN Threads ON Category.Id = Threads.FkCategoryId 
    GROUP BY Category.Name, Category.Description; 

    SELECT COUNT(Posts.Id) AS NumberOfPosts 
    FROM Category 
    LEFT JOIN Threads ON Category.Id = Threads.FkCategoryId 
    LEFT JOIN Posts ON Threads.Id = Posts.FkThreadId 
    GROUP BY Category.Id; 

,给了我这样的结果:

enter image description here

这是正确的数据。我只想把它合并为1个查询,因为我不能从第二个查询中“Eval”“NumberOfPosts”。

我得到这个错误:

"DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'NumberOfPosts'"

我已阅读并尝试了很多不同的东西,不知道如何解决它。我希望有人能帮帮忙。

回答

0

请尝试类似如下:

SELECT CatThread.CategoryName, CatThread.CategoryDescription, 
    CatThread.NumberOfThreads, 
    COUNT(Posts.Id) AS NumberOfPosts 
FROM 
    (select Category.Id, Category.Name AS CategoryName, Category.Description AS CategoryDescription, 
    COUNT(Threads.Id) AS NumberOfThreads 
    from Category 
     LEFT JOIN Threads ON Threads.FkCategoryId = Category.Id 
    group by Category.Id, Category.Name, Category.Description) CatThread 
    LEFT JOIN Threads ON Threads.FkCategoryId = CatThread.Id 
    LEFT JOIN Posts ON Posts.FkThreadId = Threads.Id 
GROUP BY CatThread.CategoryName, CatThread.CategoryDescription, 
    CatThread.NumberOfThreads 

我没有创建表,这样以确保这个工程,但我相信这个查询应该给你你想要的东西。你可能需要调整语法等。基本思想是使用子查询来获取单行中的每个类别的线程数,然后将其加入到邮件表中。

+1

我编辑了查询。 Dimt是正确的,我在主查询中缺少连接。子查询需要通过线程表连接。 –

+0

谢谢。这很好。现在我只需要研究代码来了解发生了什么,因为我之前没有真正玩过子查询:) – chmodder

2

我想你刚刚错过了第二次加入的加入条件Post.FkUserId = Threads.FkUserId

尝试:因为你在Threads.Id = Posts.FkThreadId只能加入

LEFT JOIN Posts ON Threads.Id = Posts.FkThreadId AND PostFkUserId = Threads.FkUserId 

基本上你匹配查询更多的记录。在表中有7个记录FkThreadId是7,6,6,5,2,2,2。

+0

啊,是的,我错过了。这就是我没有创建表格并真正尝试它的原因。 –

+0

你的回答也很有帮助。谢谢。 – chmodder