2012-04-10 236 views
3

我不能得到這個SQL查詢的權利...SELECT DISTINCT TOP 5在SQL Server

我想從tblComment前5的最新評論。問題是我得到的評論和ProductID相同。我不想那樣。

SELECT DISTINCT TOP 5 
    tblProduct.ProductID, 
    tblProduct.ProductName, 
    tblComment.DateAdded 
FROM 
    tblComment 
INNER JOIN 
    tblProduct ON tblProduct.ProductID = tblComment.ProductID 
ORDER BY 
    tblComment.DateAdded DESC 

我在做什麼錯?

+1

因此,有五種不同的產品,並且您希望每個產品的最新評論? – 2012-04-10 17:59:23

+0

這是一對多連接。你會得到很多行:)在這裏看看這個問題:http://stackoverflow.com/questions/6922675/how-to-select-unique-rows-from-one-to-many-relationed-tables-in-mysql – PhD 2012-04-10 17:59:25

+0

有數以百計的產品,我想要加入最近有評論的前5名產品。即使一件產品有最新的五條評論,我也不會因此而想要該產品五次。我需要五個不同的產品。 – user1007103 2012-04-10 18:04:30

回答

6

假設你的評語表有一個ID字段嘗試這個辦法:通過最新的評論的時候排名

​​3210
+1

+1最乾淨的答案,加入最大值。 – Taryn 2012-04-10 18:12:18

+0

工程太棒了!非常感謝! – user1007103 2012-04-10 18:14:10

0

您將不得不子選擇 - 使用下面的示例來滿足您的需求。

SELECT TOP 5 tblProduct.ProductID, 
      tblProduct.ProductName, 
      tblComment.DateAdded 
FROM tblComment INNER JOIN 
    tblProduct ON tblProduct.ProductID = tblComment.ProductID 
    and tblProduct.ProductID 
     IN (
      SELECT tblProduct.ProductID 
      FROM tblComment 
        INNER JOIN tblProduct ON tblProduct.ProductID = tblComment.ProductID 
      GROUP BY tblProduct.ProductID 
      HAVING count(tblProduct.ProductID ) =1 
     ) 
0

產品。

該方法使用CTE和秩函數。這個查詢很小,但在較大的查詢中,這些函數可以使事情更有組織性和可讀性。

with lastComment as (
    select c.productID, max(DateAdded) DateAdded, 
    row_number() over(order by max(dateAdded)) rank 
    from tblComment c 
    group by c.productID 

) 

SELECT 
    tblProduct.ProductID, 
    tblProduct.ProductName, 
    tblComment.DateAdded 
FROM 
    tblProduct 
    join lastComment ON tblProduct.ProductID = lastCommnet.ProductID 
WHERE 
    lastComment.rank >= 5 
ORDER BY lastComment.rank