2014-03-13 73 views
0

我正在努力與以下SQL: 我有一個表有一個站點的site_id和referrer域。我只是簡單地計算引薦來源和網站的出現次數,然後計算一個網站的所有引薦來源的總數。MySQL:計數和總計爲兩個不同的分組

在我的結果下面的計數和網站總數不正確。計數應該是一半,例如對於網站ID 1,谷歌和亞馬遜的數量應該是10,而站點ID 2的總數應該是18. 任何想法我可能做錯了什麼?

SELECT site_id, I.referrer_domain AS referrer_domain, COUNT(*) AS items, t.site_total 
    FROM qVisitor_Tracking_1 as I, 
     (SELECT COUNT(1) AS site_total 
     FROM `qVisitor_Tracking_1` 
     WHERE `referrer_domain` != '' group by site_id) AS T 
WHERE `referrer_domain` != '' 
GROUP BY `site_id`, referrer_domain 


site_id referrer count site total 
1   amazon 20  24 
1   google 20  24 
2   amazon 12  24 
2   google 18  24 
+0

這可以b e實現使用子查詢,但sql的性能應該很慢。爲什麼你不試圖使用兩個不同的查詢而不是單個查詢? – Mosiur

回答

2

如果我理解你的要求,它看起來像你缺少ON子句來加入子查詢到主表。

SELECT I.site_id, 
     I.referrer_domain AS referrer_domain, 
     COUNT(*) AS items, 
     T.site_total 
FROM qVisitor_Tracking_1 as I 
INNER JOIN 
(
    SELECT site_id, 
      COUNT(1) AS site_total 
    FROM qVisitor_Tracking_1 
    WHERE referrer_domain != '' 
    GROUP BY site_id 
) AS T 
ON I.site_id = T.site_id 
WHERE referrer_domain != '' 
GROUP BY I.site_id, referrer_domain, T.site_total 
+0

你是個好人。非常感謝! – dutchman711

0

您在I和T之間沒有JOIN,既不直接也不間接(在where部分中)。所以yoou剛纔乘法

FROM qVisitor_Tracking_1 as I, 
     (SELECT COUNT(1) AS site_total 
     FROM `qVisitor_Tracking_1` 
     WHERE `referrer_domain` != '' group by site_id) AS T 
WHERE `referrer_domain` != '' 
1

在MySQL中,你可以使用GROUP BY修改WITH ROLLUP

SELECT site_id, referrer_domain COUNT(*) AS items 
    FROM qVisitor_Tracking_1 
WHERE referrer_domain != '' 
GROUP BY site_id, referrer_domain WITH ROLLUP 

它應該給這樣的結果:

site_id referrer items 
1   amazon 7 
1   google 13 
1   NULL  20 
2   amazon 6 
2   google 9 
2   NULL  15 
NULL  NULL  35 

見:http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html

+0

謝謝,我會試試看! – dutchman711