LeetCode MySQL查询结果匹配却未通过,求问题排查
问题原因与修正方案
你的SQL查询存在两个关键问题,其中整数除法导致的精度错误是无法通过测试的核心原因:
1. 整数截断除法的问题
在MySQL、PostgreSQL等多数SQL数据库中,两个整数类型的值相除会执行整数截断除法——直接舍弃小数部分,只保留整数结果。例如:
- 当用户有1次确认请求、2次总请求时,
SUM(...)返回1(整数),count(s.user_id)返回2(整数),1/2的结果是0而非0.5 - 经过
ROUND(0,2)处理后得到0.00,与题目预期的0.50不符
2. 总请求数统计逻辑的不严谨
你使用count(s.user_id)统计总请求数,虽然在用户无确认请求时能得到0/1=0的正确结果,但这是巧合:
s.user_id来自Signups表(左连接的主表),无论用户是否有确认请求,该字段都不为空,所以count(s.user_id)在用户无请求时会返回1(对应Signups表的单条记录)- 正确的总请求数应该统计Confirmations表中的记录数,即
count(c.user_id)——当用户无请求时,该值为0,此时直接除法会得到NULL,需要用IFNULL或COALESCE转换为0
修正后的SQL查询
方案一:修复除法精度与统计逻辑
SELECT s.user_id, ROUND( IFNULL( SUM(CASE WHEN c.action = 'confirmed' THEN 1.0 ELSE 0 END) / COUNT(c.user_id), 0 ), 2 ) AS rate FROM Signups s LEFT JOIN Confirmations c ON s.user_id = c.user_id GROUP BY s.user_id;
- 用
1.0替代1,让CASE表达式返回浮点数,确保除法为浮点数运算 - 用
COUNT(c.user_id)统计真实总请求数,并用IFNULL处理无请求时的NULL结果
方案二:更简洁的AVG函数写法
SELECT s.user_id, ROUND( AVG(CASE WHEN c.action = 'confirmed' THEN 1.0 ELSE 0 END), 2 ) AS rate FROM Signups s LEFT JOIN Confirmations c ON s.user_id = c.user_id GROUP BY s.user_id;
- AVG函数会自动计算平均值,且当用户无请求时,所有CASE结果为0,AVG(0)直接返回0,无需额外处理NULL
1.0确保计算过程为浮点数类型,避免整数截断
内容的提问来源于stack exchange,提问作者Azimovsky
相关产品推荐
相关产品推荐

