这两天写项目遇到了一个问题
SELECT
device_type,
COUNT(*) AS deviceCount,
COUNT(use_end_time<NOW())AS endCOunt
FROM t_cfg_device WHERE device_use_state = 1
GROUP BY device_type
我想求在一个select中求两个条件不同的sql, 可是如上图所示,这样的COUNT(use_end_time<NOW())是错误的,查询出来的结果对不上,我又查询了count的使用方法,基本的一般是和count(*)或者count(列名)使用
count(*)所有行进行统计,包含值为null的行。
count(列名)会对指定列具有的行数进行统计,除去值为NULL的行。
count(1)与count(*) 的效果是一样的。
如果表没有主键,那么count(1)比count(*)快。
如果有主键,那么count(key value,union key value)比count(*)快。
如果表只有一个字段,count(*)最快。
count(1)和count(主键列名)一样,只扫描主键。count(*)和count(非主键列名)一样,扫描整个表
可是以上都达不到我想要的效果,我想在count中放的是表达式use_end_time<NOW(),如同这样的表达式,然后我总结出来了两个放表达式的方法,一个是用if 一个是用case when
下面是我用if写的sql语句:
SELECT
device_type,
COUNT(*) AS deviceCount,
COUNT( IF(use_end_time <now(),TRUE,NULL) )AS endCount
FROM t_cfg_device WHERE device_use_state = 1
GROUP BY device_type
这样我的查询结果就是符合要求的了,还有一种case when 的方法大家也可以试一下
我把语法从别的那里粘贴了写了一下:大致就是如此了。大家可以试一下!