MySQL查询无数据时需返回0行而非1行的问题求助
解决MySQL聚合查询无数据时返回空行的问题
这个问题我之前也碰到过,原因其实是你用了SUM这类聚合函数——哪怕没有匹配的行,MySQL还是会返回一行包含NULL值的结果,而不是空结果集。要让mysql_num_rows()返回0而非1,你可以试试下面两种方法:
方法一:用HAVING子句过滤空聚合结果
在查询末尾添加HAVING子句,通过统计关联表的匹配行数来判断是否有有效数据:
SELECT t.idtest, t.testkhusus, t.biayakhusus, t.uangmuka, t.total, t.tanggallunas, t.biayatambahan, p.namaperusahaan, (SUM(jth.tarifpsikolog) + SUM(jth.tarifadministrasi) + SUM(jth.tariftester)) AS biayadll FROM test t INNER JOIN perusahaan p ON t.perusahaan_idperusahaan = p.idperusahaan INNER JOIN (jadwaltest jt INNER JOIN jadwaltest_has_biayatimelostcost jth ON jt.idjadwaltest = jth.idjadwaltest) ON t.idtest = jt.test_idtest WHERE t.tanggallunas BETWEEN '2018-05-22' AND '2018-05-23' HAVING COUNT(jth.idjadwaltest) > 0;
原理说明:
COUNT(jth.idjadwaltest)会统计关联表jadwaltest_has_biayatimelostcost的匹配行数,无有效数据时这个值为0HAVING子句在聚合计算完成后过滤结果,不满足条件的行(无数据情况)会被剔除,最终返回空结果集
方法二:将原查询作为子查询,外层过滤空值
如果更倾向于直观过滤聚合后的结果,可以把原查询嵌套成子查询,在外层筛选biayadll不为NULL的行:
SELECT * FROM ( SELECT t.idtest, t.testkhusus, t.biayakhusus, t.uangmuka, t.total, t.tanggallunas, t.biayatambahan, p.namaperusahaan, (SUM(jth.tarifpsikolog) + SUM(jth.tarifadministrasi) + SUM(jth.tariftester)) AS biayadll FROM test t INNER JOIN perusahaan p ON t.perusahaan_idperusahaan = p.idperusahaan INNER JOIN (jadwaltest jt INNER JOIN jadwaltest_has_biayatimelostcost jth ON jt.idjadwaltest = jth.idjadwaltest) ON t.idtest = jt.test_idtest WHERE t.tanggallunas BETWEEN '2018-05-22' AND '2018-05-23' ) AS temp_result WHERE temp_result.biayadll IS NOT NULL;
原理说明:
- 子查询在无数据时会返回一行
biayadll为NULL的结果 - 外层查询通过
WHERE temp_result.biayadll IS NOT NULL过滤掉这行空数据,最终返回空结果集
这两种方法都能让mysql_num_rows()在无有效数据时返回0,你可以根据自己的习惯选择其中一种。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

