去年在项目测试中,遇到一个Mysql查询问题。
(1) 问题的现象是:
交易管理_交易申报_当天可以发布今日及未来日期的邀约需求,用户侧申报今日和未来日期的需求后,在交易申报页面查看详情
比如:23,24,25有交易申报、23号申报失败Resp_status=3、24号申报成功Resp_status=1、25号申报中Resp_status=2
切换到23号时,页面展示的是其他历史日期的数据。
(2)问题的原因:
、 错误的SQL语句:
SELECT * FROM market_demand_resp
where run_date>='2021-04-23' and resp_status='0' OR resp_status='3' and tenant_id=1;
这个语句执行的逻辑是:AND优先级大于OR优先级,所以先执行( run_date>='2021-04-23' and resp_status='0')得出查询结果AA,再执行( resp_status='3' and tenant_id=1)得出查询结果BB
最后查询数据是AA和BB的并集。
(3)修正后的SQL语句:
SELECT * FROM market_demand_resp
where run_date>='2021-04-23' and (resp_status='0' or resp_status='3') and tenant_id=1;
这个语句的执行逻辑是:加括号后,调整执行顺序,查询出>='2021-04-23' ,申报状态是0或者3且tenant_id=1的记录。