【问题标题】:Mysql left join derived table inconsistent resultMysql左连接派生表结果不一致
【发布时间】:2020-04-03 04:14:33
【问题描述】:

当我从派生表(映射表)执行左连接时,我得到不同的结果

这是表格

表格1 日期值 2020-03-02 00:00:00 0 2020-03-02 07:00:00 1 2020-03-02 12:00:00 0 表_2 2020-03-02 00:00:00 0 2020-03-02 07:00:00 1 2020-03-02 12:00:00 1 2020-03-02 14:00:00 0 映射表 日期 2020-03-02 00:00:00 2020-03-02 01:00:00 2020-03-02 02:00:00 2020-03-02 03:00:00 ...

这是我的查询(我什至添加了计数器来检查 mysql 如何加入表)

SET @prevValue=0;
SET @testCtr:=0;

SELECT DATE_FORMAT(P.date,'%Y-%m-%d %H:%i:%s') AS `date`, 
@prevValue,
D.value AS 'valueOriginal',
@testCtr AS 't1',
IF(D.date IS NULL ,@prevValue, @prevValue:=D.value) AS `dataValue` ,
@prevValue,
D.value AS 'valueOriginal',
(@testCtr:=@testCtr+1) AS 't2'
    FROM (SELECT `T`.`date` FROM `Mapping_table` AS `T`
     WHERE (date >= '2020-03-02 00:00:00') AND (date <= '2020-03-02 23:59:00')) AS `P`
LEFT JOIN `Table_1` AS `D` ON D.date=P.date ORDER BY `P`.`date` ASC;

结果如下:

“2020-03-02 00:00:00”“0”“0”“0”“0”“0”“0”“1” "2020-03-02 00:01:00" \N \N "3" \N \N \N "4" "2020-03-02 00:02:00" \N \N "4" \N \N \N "5" "2020-03-02 00:03:00" \N \N "5" \N \N \N "6" "2020-03-02 00:04:00" \N \N "6" \N \N \N "7"

查询 Table_2(我刚刚将查询替换为 Table_2)产生以下结果:

“2020-03-02 00:00:00”“0”“0”“0”“0”“0”“0”“1” "2020-03-02 00:01:00" "0" \N "1" "0" "0" \N "2" "2020-03-02 00:02:00" "0" \N "2" "0" "0" \N "3" "2020-03-02 00:03:00" "0" \N "3" "0" "0" \N "4" "2020-03-02 00:04:00" "0" \N "4" "0" "0" \N "5"

我希望 Table_1 的左连接应该返回与 Table_2 相同的结果?我也不明白为什么计数器的值不同?是不是因为两张表的大小不一样?

使用的mysql版本5.7

任何帮助将不胜感激。

【问题讨论】:

    标签: mysql sql database if-statement


    【解决方案1】:

    MySQL 文档对此结构非常清楚:

    IF(D.date IS NULL ,@prevValue, @prevValue:=D.value) AS `dataValue` ,
    @prevValue,
    

    Don't do it!

    涉及用户变量的表达式的计算顺序未定义。例如,不能保证SELECT @a, @a:=@a+1 先评估@a,然后再执行分配。

    (来自 8.0 文档,但同样的警告适用于所有变量用户。)

    这解释了为什么结果不同——您要求评估的顺序与定义的顺序一致,但 MySQL 明确说您不能依赖它。

    这回答了您在此处提出的问题。如果您想要一个安全版本的查询,请提出一个新问题,并附上适当的样本数据、所需的结果和解释。

    【讨论】:

      猜你喜欢
      • 2011-02-23
      • 2013-04-12
      • 2011-10-30
      • 2012-06-10
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多