MySQL使用COUNT(IF)统计未归还租赁记录结果异常排查
问题原因
你的查询未达到预期是核心语法+逻辑错误导致的:
- NULL值判断语法错误:SQL里
NULL代表未知值,任何值和NULL做=、!=这类算术比较的返回结果永远是未知,不会被判定为成立,所以你写的return_date = null永远不会命中未归还的记录。判断NULL必须使用IS NULL/IS NOT NULL标准语法。 - 分组逻辑不规范:你SELECT子句里查询的客户字段是
customer_no,但GROUP BY分组用的是member_no,同时还查询了非分组、非聚合的rental_id、return_date字段,只有MySQL关闭严格模式时才会允许这种写法执行,返回的结果是随机无效值,不符合SQL标准。 - 额外效率问题:你没有提前过滤已归还的记录,会导致查询扫描全量租赁数据,数据量大的时候性能很差。
修正方案
优先推荐先过滤再聚合的写法,性能更高,逻辑也更清晰:
SELECT customer_no, COUNT(rental_id) AS ActualRental_per_person FROM rental_table WHERE return_date IS NULL -- 提前过滤所有已归还记录,只保留在租数据 GROUP BY customer_no -- 分组字段和查询的客户维度保持一致 ;
如果业务需要同时统计客户的总租赁数、在租数等多维度指标,可以用条件聚合写法,注意NULL判断的正确语法:
SELECT customer_no, COUNT(IF(return_date IS NULL, rental_id, NULL)) AS ActualRental_per_person, COUNT(rental_id) AS TotalHistoricalRental FROM rental_table GROUP BY customer_no ;
补充说明:这个NULL判断的规则是ANSI SQL标准,所有主流数据库(MySQL、PostgreSQL、SQL Server、Oracle等)都遵循,不存在数据库兼容差异。
内容的提问来源于stack exchange,提问作者Giovanni De Franceschi
相关产品推荐
相关产品推荐

