2014-08-27 49 views
0

我有一个只有两列,用于分配评论意见图像。SQL Server:问题与选择和计数在小查询

第一列包含图像ID,第二列包含关联的评论ID。 图片可以有多个评论,但每个评论都有唯一的评论ID。

基于此,我希望得到一个排名降序的基础上评论数每个图像,所以最多的意见应该出现在最上面的图像。

我尝试了以下,但SQL不接受Distinct和XML的组合。 这里使用Distinct的想法是摆脱重复,因为我只想要每个图像在结果中出现一次。

有人能告诉我如何实现这一目标吗?

我的SQL:

BEGIN 

    SET NOCOUNT ON; 

    SELECT DISTINCT  Top 20 A.imgID, 
       COUNT(*) OVER() AS volume, 
       (
        SELECT  B.commentID, 
           COUNT(*) OVER() AS volume 
        FROM  MOC_ImgComments B 
        WHERE  B.imgID = A.imgID 
        FOR XML PATH(''), ELEMENTS, TYPE 
       ) 
    FROM  MOC_ImgComments A 
    ORDER BY volume desc, A.imgID 
    FOR XML PATH('images'), ELEMENTS, TYPE, ROOT('ranks') 

END 

非常感谢您的帮助,蒂姆。

+1

您需要将a.imgID添加到您的主查询中。您也可能希望通过添加到您的子查询来控制订单。 – 2014-08-27 13:15:09

+0

谢谢!关于子查询,我想我可以跳过Order By,因为我只需要那里的音量。对于主要查询,我是否需要通过img ID进行分组,这就是它? – user2571510 2014-08-27 13:16:51

回答

1

请尝试使用GROUP BY子句。我没有测试下面的代码。

BEGIN 

SET NOCOUNT ON; 

SELECT Top 20 A.imgID, 
      COUNT(*) OVER() AS volume, 
      (
       SELECT  B.commentID, 
          COUNT(*) OVER() AS volume 
       FROM  MOC_ImgComments B 
       WHERE  B.imgID = A.imgID 
       FOR XML PATH(''), ELEMENTS, TYPE 
      ) 
FROM  MOC_ImgComments A 
ORDER BY volume desc, A.imgID 
FOR XML PATH('images'), ELEMENTS, TYPE, ROOT('ranks') 
group by A.imgID 
END 
+0

感谢您的支持。这给了我正确的结果(当从主查询中移除计数并通过上面的xml行移动组时,我无法根据子查询中的卷降序排序。 – user2571510 2014-08-27 14:31:31