Laravel 5.5条件统计count(*) as total:http_response=0时total需为0
嗨,我来帮你搞定这个Laravel查询的问题~
你想要的效果是:执行count统计并返回total字段,但当http_response等于0时,不管原本count出来的数值是多少(比如你现在得到的1),都把total设为0。对吧?
这里给你两种实用的实现方式,完美适配Laravel 5.5的语法:
方式一:使用IF函数(MySQL友好,写法简洁)
这种方式适合针对单条记录或者分组后的每条数据,根据自身的http_response值来决定total:
$result = DB::table('你的表名') // 这里可以添加你的业务筛选条件,比如->where('status', 1) ->selectRaw('IF(http_response = 0, 0, COUNT(*)) as total') // 如果是分组统计,记得加上groupBy,比如->groupBy('user_id') ->first(); // 单条结果用first(),多条结果用get()
对应的原生SQL参考:
SELECT IF(http_response = 0, 0, COUNT(*)) as total FROM 你的表名 WHERE ...;
方式二:使用CASE语句(兼容性更强,支持多数据库)
如果你的项目未来可能切换到其他数据库(比如PostgreSQL),用CASE语句会更通用:
$result = DB::table('你的表名') ->selectRaw(' CASE WHEN http_response = 0 THEN 0 ELSE COUNT(*) END as total ') // 按需添加where、groupBy等条件 ->first();
对应的原生SQL参考:
SELECT CASE WHEN http_response = 0 THEN 0 ELSE COUNT(*) END as total FROM 你的表名 WHERE ...;
额外场景:只要结果集中存在任意一条http_response=0,total就设为0
如果你的需求是:只要查询范围内有记录的http_response是0,整个统计的total就直接设为0,否则返回正常count值,可以这样写:
$result = DB::table('你的表名') ->selectRaw(' CASE WHEN EXISTS(SELECT 1 FROM 你的表名 WHERE http_response = 0 AND 你的其他筛选条件) THEN 0 ELSE COUNT(*) END as total ') ->first();
记得把代码里的你的表名和你的其他筛选条件替换成你实际的表名和业务逻辑哦~
内容的提问来源于stack exchange,提问作者Dr. House
相关产品推荐
相关产品推荐

