查询投注数据库用户连胜的SQL结果异常,求错误排查
问题原因
- 核心错误出在计算RunGroup的子查询未限定用户范围
你内层统计RunGroup的语句中,FROM bets G没有添加G.user = GR.user的过滤条件,导致计算分组时混入了其他用户的投注记录,不是单独针对user=4的记录计算连续组,因此把实际的3连胜错误拆分到了不同的RunGroup中,最终统计出来的连胜场次偏小。 - 潜在的Pending状态逻辑问题
你的数据中存在Pending状态的记录,当前逻辑只要result不相等就会生成新的分组,如果你的业务规则是Pending状态不中断连胜(仅Loss中断),需要调整不等判断的逻辑,避免Pending错误切断连胜序列。
修正后的SQL语句
SELECT * FROM (SELECT Result, MIN(date) as StartDate, MAX(date) as EndDate, COUNT(*) as Games FROM (SELECT *, (SELECT COUNT(*) FROM bets G WHERE G.user = GR.user -- 新增同用户过滤条件 AND G.result <> GR.result AND G.date <= GR.date) as RunGroup FROM bets GR WHERE user = 4 ORDER BY date DESC) A GROUP BY result, RunGroup ORDER BY Min(date)) A WHERE result = 'Win' ORDER BY Games DESC
如果需要Pending不打断连胜,可将RunGroup的计算条件调整为:
WHERE G.user = GR.user AND G.result = 'Loss' AND GR.result = 'Win' AND G.date <= GR.date
关于LIMIT 1的疑问
修复上述错误后,如果你只需要获取最长的一条连胜记录,在语句末尾添加LIMIT 1是可以满足需求的。注意如果存在多条相同最大连胜场次的记录,LIMIT 1只会返回按Games DESC排序后的第一条,如果你需要返回所有场次并列最大的连胜记录,可以改用窗口函数RANK()来筛选排名为1的记录。
内容的提问来源于stack exchange,提问作者MomasVII
相关产品推荐
相关产品推荐

