MySQL查询问题:WHERE子句比较Unix时间戳返回Null
问题解决:Grafana查询中变量匹配返回Null的问题
问题原因
你原来的查询写法存在执行顺序逻辑问题:MySQL的执行优先级是先处理WHERE子句,再处理SELECT子句。也就是说,当WHERE里判断unix_timestamp(coffeeTimestamp) = @stamp时,@stamp还没被SELECT中的子查询赋值,此时变量处于Null状态,自然匹配不到任何数据。而直接写具体时间戳时,WHERE能直接匹配条件,所以能返回正常结果。
解决方案
给你两种可行的写法:
方案1:用子查询关联(推荐,无需变量)
这种写法避开变量赋值的顺序问题,直接把最新时间戳作为临时表关联查询:
SELECT al.TimeAxis, al.WeightAxis FROM ArrayLog al INNER JOIN ( -- 获取CoffeeData中最新的unix时间戳 SELECT unix_timestamp(coffeeTimestamp) AS latest_stamp FROM CoffeeData ORDER BY timestamp DESC LIMIT 1 ) cd ON unix_timestamp(al.coffeeTimestamp) = cd.latest_stamp
方案2:提前赋值变量(需Grafana支持多语句执行)
先单独完成变量赋值,再执行查询,确保WHERE判断时变量已有有效值:
-- 先获取最新时间戳赋值给变量 SET @stamp = (SELECT unix_timestamp(coffeeTimestamp) FROM CoffeeData ORDER BY timestamp DESC LIMIT 1); -- 再查询ArrayLog的数据 SELECT TimeAxis, WeightAxis FROM ArrayLog WHERE unix_timestamp(coffeeTimestamp) = @stamp;
注意:如果用这种写法,需要在Grafana的数据源配置中开启「允许执行多语句」的选项(比如MySQL数据源里的Allow multi-statements开关)。
内容的提问来源于stack exchange,提问作者Macropodux
相关产品推荐
相关产品推荐

