2012-11-30 49 views
2

我遇到了一些小問題。
我必須從查詢喜歡和收集兩個計數,但是當我添加第二個查詢而不是2 likes and 10 collects我得到10 likes and 10 collects
我在這裏做錯了什麼?sql中存在多個COUNT

select COUNT(tl.ItemLikeId) as a, COUNT(tib.PacketId) as b 
from Items i 
left join ItemLikes il 
on il.ItemId = i.ItemId 
left join ItemsInPackets iip 
on iip.ItemId = i.ItemId 
where i.ItemId = 14591 

回答

6

嘗試SELECT COUNT(DISTINCT tl.ItemLikeId) AS a, COUNT(DISTINCT tib.PacketId) as b

您的連接爲您提供了10行,因此您每個表中都有10個ID。但是,並非所有的ID都是唯一的。您正在尋找唯一的ID。

+0

是我現在看到我的錯誤。在ItemInPocket中是N:N表。所以我沒有添加自動增量列。當我在這些鍵上使用截然不同的東西:) – 1110

2

Count返回行數。不是具有值的行數,而不是不同行的數量。

要獲得數行的行用一個值

select SUM(CASE WHEN tl.ItemLikeId IS NOT NULL THEN 1 ELSE 0 END) as a, 
     SUM(CASE WHEN tib.PacketId IS NOT NULL THEN 1 ELSE 0 END) as b 

要獲得不同值的數量,做zimdanen建議什麼,使用COUNT(DISTINCT)

select COUNT(DISTINCT tl.ItemLikeId) as a, COUNT(DISTINCT tib.PacketId) as b 

另一種方法,如果你使用的是ItemLikesItemsInPackets爲計數

select 
    (
     SELECT COUNT(ItemLikeId) 
     FROM ItemLikes 
     WHERE ItemId = i.ItemId 
    ) as a, 
    (
     SELECT COUNT(PacketId) 
     FROM ItemsInPackets 
     WHERE ItemId = i.ItemId 
    ) as b 
from Items i 
where i.ItemId = 14591 
+1

實際上,'COUNT(rowname)'會給你一個有'rowname'值的行數。 'COUNT(1)'或'COUNT(*)'會給你一個連續的行數。 – zimdanen

+0

@zimdanen好的電話。我正在記憶中,但我查了一下,你是對的。 – cadrell0