MySQL使用变量生成日期过滤查询返回0结果,问题何在?
MySQL查询无结果问题排查与解决
问题描述
我有一张包含year、month和price字段的表,尝试通过year与month字段生成日期变量来过滤表数据,执行的查询语句如下:
SELECT @date_create := STR_TO_DATE(CONCAT(`year`, '-', `month`, '-1'), '%Y-%m-%d'),`price` FROM table WHERE @date_create >= '2023-05-01'
但MySQL返回0条结果,而实际应有结果,请问该查询存在什么问题?
核心问题
MySQL的执行逻辑是先执行WHERE子句过滤数据,再执行SELECT子句进行字段赋值与计算。你在WHERE中使用的@date_create变量,此时还未被SELECT里的语句赋值,它的值要么是会话残留的无效值,要么是NULL,根本无法匹配到符合条件的数据,所以返回空结果。
修正方案
方案一:直接在WHERE子句中生成判断条件
无需借助变量,直接在过滤逻辑里生成日期进行比较:
SELECT STR_TO_DATE(CONCAT(`year`, '-', `month`, '-1'), '%Y-%m-%d') AS date_create, `price` FROM `table` WHERE STR_TO_DATE(CONCAT(`year`, '-', `month`, '-1'), '%Y-%m-%d') >= '2023-05-01'
方案二:通过子查询先生成日期字段再过滤
先在子查询中生成完整的日期字段,再在外层查询中进行过滤:
SELECT date_create, price FROM ( SELECT STR_TO_DATE(CONCAT(`year`, '-', `month`, '-1'), '%Y-%m-%d') AS date_create, `price` FROM `table` ) AS temp_table WHERE date_create >= '2023-05-01'
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

