0

我目前正在使用其他一些统计数据进行命中计数器,例如登录访问者的百分比等等。

到目前为止,我已经尝试了许多不同的 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 语句中计算了所有行。不过,前两个语句工作得很好。

我敢肯定现在有人在笑他的屁股,但这是我尝试过的。

任何朝着正确方向的轻推将不胜感激!

4

2 回答 2

3

如下所述:COUNT(expr)

返回由语句检索的行中非NULL值的数量的计数。exprSELECT

在您的第三种情况下,当该表达式的计算结果为orexpruser_id > 0,它是 non- ;因此结果不是你所期望的。NULLTRUEFALSECOUNT()

由于 MySQL 没有真正的布尔类型,而是分别使用1and 和0for TRUEFALSE您可以简单地使用SUM()代替;在其他 RDBMS 中,您必须使用CASE表达式

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

对于您的第四个表达式,您可以执行以下操作:

COUNT(DISTINCT CASE WHEN user_id > 0 THEN ip ELSE NULL END)
于 2012-11-30T10:08:17.137 回答
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
于 2012-11-30T10:05:01.000 回答