You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:22:44