Mysql Левый вывод производной таблицы противоречивый результат - PullRequest
0 голосов
/ 03 апреля 2020

Когда я выполняю левое соединение из производной таблицы (таблицы сопоставления), я получаю разные результаты

Вот таблицы

Table_1

Date                    Value
2020-03-02 00:00:00      0
2020-03-02 07:00:00      1
2020-03-02 12:00:00      0

Table_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

Mapping_table
Date
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"

Я ожидаю, что левое соединение из Таблицы_1 должно вернуть то же самое, что и результат Таблицы_2? Я также не понимаю, почему счетчики не имеют одинаковое значение? Это потому, что две таблицы имеют разный размер?

Mysql Используемая версия 5.7

Любая помощь приветствуется.

1 Ответ

1 голос
/ 03 апреля 2020

MySQL документация достаточно ясна об этой конструкции:

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

Не делайте этого!

Порядок вычисления выражений с участием пользовательских переменных не определено. Например, нет гарантии, что SELECT @a, @a:=@a+1 сначала оценит @a, а затем выполнит присваивание.

(Это из документации 8.0, но то же предупреждение относится ко всем пользователям переменных.)

Это объясняет, почему результаты отличаются - вы требуете, чтобы порядок оценки был в порядке определения, но MySQL явно говорит, что вы не можете зависеть от этого.

Это отвечает на ваши вопросы здесь. Если вам нужна безопасная версия запроса, задайте новый вопрос с соответствующими примерами данных, желаемыми результатами и пояснениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...