【问题标题】:Mysql left join store previous value if condition query correction如果条件查询更正,Mysql左连接存储先前的值
【发布时间】:2020-04-06 05:42:00
【问题描述】:

当我使用 if 条件中的变量 @prevValue 从派生表(映射表)执行左连接以存储先前的值时,我得到不同的结果

这是表格

表格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;

SELECT DATE_FORMAT(P.date,'%Y-%m-%d %H:%i:%s') AS `date`, 
IF(D.date IS NULL ,@prevValue, @prevValue:=D.value) AS `dataValue`
    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” "2020-03-02 00:01:00" \N "2020-03-02 00:02:00" \N "2020-03-02 00:03:00" \N "2020-03-02 00:04:00" \N "2020-03-02 00:05:00" \N

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

日期值 -------------------------- “2020-03-02 00:00:00” “0” “2020-03-02 00:01:00” “0” “2020-03-02 00:02:00” “0” “2020-03-02 00:03:00” “0” “2020-03-02 00:04:00” “0” “2020-03-02 00:05:00” “0”

我想要的结果是最后一个。我希望 Table_1 的左连接应该返回与 Table_2 相同的结果?你们知道我应该在查询中更改什么或解释为什么会发生这种情况吗?

使用的mysql版本5.7

【问题讨论】:

标签: mysql sql database if-statement


【解决方案1】:

评论有点长。

在 MySQL 8+ 中,SELECT 中的变量已弃用。 . .并且有充分的理由。有更好的方法来做你想做的事。

我很确定问题出在订购上。您希望在 ORDER BY 之后评估变量。唉,我记得这在 MySQL 5.x 的更高版本中发生了变化。

因此,您的问题的解决方案是使用带有ORDER BY 的子查询来按您想要的顺序获取行。 MySQL 实现了这样的子查询,因此排序是“固定的”(尽管我不喜欢依赖它;)。然后在外部查询中使用变量。

请注意,您需要与GROUP BY 类似的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2019-06-17
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2014-09-24
    相关资源
    最近更新 更多