MySQL中的几个条件计数

MySQL中的几个条件计数,mysql,count,Mysql,Count,我目前正在做一个点击计数器和一些其他统计数据,比如被登录的访问者的百分比等等 到目前为止,我已经尝试了许多不同的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

我目前正在做一个点击计数器和一些其他统计数据,比如被登录的访问者的百分比等等

到目前为止,我已经尝试了许多不同的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
显然这是错误的。我将在第三个和第四个COUNT语句中统计所有行,尽管有些行的user_id为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
试试这个:

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
如以下文件所述:

返回语句检索到的行中expr的非空值数的计数

在第三种情况下,expr为user_id>0,当该表达式的计算结果为TRUE或FALSE时,它是非NULL的;因此,计数的结果并不是你所期望的

由于MySQL没有真正的布尔类型,而是分别使用1和0表示true和FALSE,因此您可以简单地使用;在其他RDBMS中,您必须使用:

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

COUNT(DISTINCT CASE WHEN user_id > 0 THEN ip ELSE NULL END)
如以下文件所述:

返回语句检索到的行中expr的非空值数的计数

在第三种情况下,expr为user_id>0,当该表达式的计算结果为TRUE或FALSE时,它是非NULL的;因此,计数的结果并不是你所期望的

由于MySQL没有真正的布尔类型,而是分别使用1和0表示true和FALSE,因此您可以简单地使用;在其他RDBMS中,您必须使用:

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

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

第四次计数背后的逻辑是什么?计算用户id大于0的不同ip的数量。别问我,我不知道我怎么能期待我尝试的工作,但你必须从某个地方开始p第四次计数背后的逻辑是什么?计算用户id大于0的不同ip的数量。别问我,我不知道我怎么能期待我尝试的工作,但你必须从某个地方开始小袋昂贵的并且还将为db.tblhits中的每个记录返回一次结果-1这正是我想要的,尽管根据juergen d的建议,我在第三次盘点时使用了SUM。选择COUNT*作为totalhits,COUNTDISTINCT ip作为Visitor,SUMuser_id>0作为hitsloggedin,选择COUNTDISTINCT ip FROM db.tblhits,其中user_id>0作为Visitor Sloggedin FROM db.tblhitsOuch。昂贵的并且还将为db.tblhits中的每个记录返回一次结果-1这正是我想要的,尽管根据juergen d的建议,我在第三次盘点时使用了SUM。选择COUNT*AS totalhits,COUNTDISTINCT ip AS visitors,SUMuser_id>0 AS hitsloggedin,选择COUNTDISTINCT ip FROM db.tblhits,其中user_id>0 AS visitorsloggedin FROM db.tblhitsI在第三个COUNT语句中使用SUM,并在尝试了您对第四个语句的建议后,这就是我坚持的。非常感谢您分享您的知识!我用SUM作为第三个COUNT语句,在尝试了你对第四个语句的建议后,我坚持使用SUM。非常感谢您分享您的知识!