Mysql оставлено предыдущее значение при сохранении запроса на исправление условия - PullRequest
0 голосов
/ 06 апреля 2020

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

Вот таблицы

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;

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;

Результаты к следующему:

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

Запрос к Таблица_2 (я только что заменил запрос таблицей_2) дает следующее:

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

1 Ответ

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

Это немного долго для комментария.

В MySQL 8+, переменные в SELECT устарели. , , и не зря. Есть превосходные методы, чтобы делать то, что вы хотите.

Я почти уверен, что проблема заключается в заказе. Вы хотите, чтобы переменные оценивались после ORDER BY. Увы, я помню, что это изменилось в более поздних версиях MySQL 5.x.

Итак, решение вашей проблемы - использовать подзапрос с ORDER BY, чтобы получить строки в нужном вам порядке. MySQL материализовал такие подзапросы, поэтому порядок «фиксирован» (хотя я не люблю зависеть от этого;). Затем используйте переменные во внешнем запросе.

Обратите внимание, что вам нужен аналогичный подход с GROUP BY.

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