2014-08-27 64 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