2012-11-30 42 views
0

我目前正在使用一些其他統計數據,如訪問者的登錄百分比等。在MySQL中有條件的幾個COUNTs

我已經嘗試了很多不同的SQL查詢,到目前爲止,但目前我堅持這一點:

SELECT COUNT(*) AS totalhits, 
COUNT(DISTINCT ip) AS visitors, 
COUNT(user_id > 0) AS hitsloggedin, 
COUNT(DISTINCT ip, user_id > 0) AS visitorsloggedin 
FROM db.tblhits 

顯然,這是錯誤的。儘管有user_id爲0的行,但我得到的所有行都計入第三個和第四個COUNT語句中。儘管如此,兩個第一條語句工作得很好。

我確定有人現在笑他的屁股,但這是我試過的。

任何在正確的方向微調將不勝感激!

+1

什麼是落後第4個讀數的邏輯是什麼? –

+0

計算不同ip的數量,其中user_id大於0.不要問我,我不知道我怎麼能期待我嘗試工作,但你必須從某個地方開始。 :P –

回答

3
作爲

COUNT(expr)記載:

返回在由SELECT檢索的行exprNULL值的數量的計數聲明。

凡在第三種情況下expruser_id > 0,它是非NULL時表達式計算結果爲TRUEFALSE;因此COUNT()的結果不是你所期望的。

由於MySQL沒有真正的布爾類型,而是使用10TRUEFALSE分別,你可以簡單地使用SUM()代替;在其他RDBMS,你必須使用一個CASE expression

COUNT(CASE WHEN user_id > 0 THEN 1 ELSE NULL END) 

爲了您的第四表達,你可以這樣做:

COUNT(DISTINCT CASE WHEN user_id > 0 THEN ip ELSE NULL END) 
+0

我對第三個COUNT語句使用了SUM(),並在嘗試了第四條語句的建議之後,我堅持使用它。非常感謝您分享您的知識! –

0

嘗試此::

SELECT 

(Select COUNT(*) FROM db.tblhits)AS totalhits, 
(select COUNT(DISTINCT ip) FROM db.tblhits) AS visitors, 
(select COUNT(user_id) FROM db.tblhits where user_id>0) AS hitsloggedin, 
(select COUNT(DISTINCT ip) FROM db.tblhits where user_id > 0) AS visitorsloggedin 
FROM db.tblhits 
+0

哎。昂貴。並且還會爲'db.tblhits'中的每個記錄返回一次結果。 -1 – eggyal

+0

這正是我所期待的,儘管我根據Juergen's的建議使用SUM作爲第三個COUNT語句。 \t'SELECT COUNT(*)AS totalhits, \t COUNT(DISTINCT IP)作爲訪客, \t SUM(USER_ID> 0)AS hitsloggedin, \t( \t \t SELECT COUNT(DISTINCT IP) \t \t FROM分貝.tblhits \t \t WHERE user_id> 0 \t)AS visitorsloggedin \t FROM db。tblhits' –