ОБНОВЛЕНИЕ ВНУТРЕННЕГО СОЕДИНЕНИЯ в неизвестном столбце в предложении - PullRequest
0 голосов
/ 21 января 2019

Я знаю, что уже есть некоторые ответы на этот вопрос, но ни один из них, похоже, не работает для меня.

В принципе, у меня есть задачи, которые представляют собой не что иное, как предустановки, запланированные с течением времени: я хочу обновитьдата выполнения задач при достижении сроков;также, когда я достигаю крайнего срока, мне нужно обновить значения таблицы компонентов в соответствии с предустановленными значениями.

Я успешно выполнил запрос на обновление крайних сроков, который выглядит следующим образом:

UPDATE tasks

    SET tasks.start_date = DATE_ADD(
    tasks.start_date, INTERVAL tasks.frequency SECOND
    )

    WHERE tasks.start_date <= CURRENT_DATE AND tasks.hour <= CURRENT_TIME

Когда я пытаюсь обновить строки компонентов одновременно со сроками, я не могу заставить их работать.Мой запрос выглядит так:

    UPDATE tasks,components 

    INNER JOIN presets ON presets.id = tasks.id_preset
    INNER JOIN preset_values ON preset_values.id_preset = presets.id
    INNER JOIN preset_values AS pv2 ON pv2.serial_number = 
    components.serial_number 

    SET tasks.start_date = DATE_ADD(
    tasks.start_date, INTERVAL tasks.frequency SECOND
    ),
    components.value = pv2.value,
    components.state = pv2.on_off

    WHERE tasks.start_date <= CURRENT_DATE AND tasks.hour <= CURRENT_TIME

Я получаю сообщение об ошибке: MySQL сказал: Documentation

1054 - Неизвестный столбец 'tasks.id_preset' в 'предложении'

Можете ли вы помочь мне заставить этот запрос работать?спасибо

таблица компонентов: https://i.stack.imgur.com/VOZX8.png

таблица предустановок: https://i.stack.imgur.com/Fs7yO.png

таблица preset_values: https://i.stack.imgur.com/AZkcm.png

таблица задач: https://i.stack.imgur.com/0qSEe.png

РЕДАКТИРОВАТЬ : дважды подумав, я выбрал два отдельных запроса на обновление.В настоящее время это выглядит так.Если у кого-то есть одно решение для обновления, я буду рад его использовать, если оно лучше по производительности.В противном случае я буду придерживаться этого решения на данный момент.Спасибо всем за вашу помощь.

BEGIN
    UPDATE
        components AS c1
    INNER JOIN preset_values AS pv1
    ON
        pv1.serial_number = c1.serial_number
    INNER JOIN tasks AS t1
    ON
        t1.id_preset = pv1.id_preset
    SET
        c1.value = pv1.value,
        c1.state = pv1.on_off
    WHERE
        t1.start_date <= CURRENT_DATE AND t1.hour <= CURRENT_TIME AND t1.on_off=1;
    UPDATE
        tasks
    SET
        tasks.start_date = DATE_ADD(
            tasks.start_date,
            INTERVAL tasks.frequency SECOND
        )
    WHERE
        tasks.start_date <= CURRENT_DATE AND tasks.hour <= CURRENT_TIME AND t1.on_off=1 ;
END

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Если вам действительно необходимо перекрестное соединение по какой-либо причине (крайне маловероятно), вы должны использовать предложение CROSS JOIN или поменять разделенные запятыми таблицы на components, tasks. Ваш запрос

UPDATE tasks,components INNER JOIN presets ON presets.id = tasks.id_preset ...

означает

UPDATE tasks, (components INNER JOIN presets ON presets.id = tasks.id_preset) ...

Очевидно, что нет tasks.id_preset в components INNER JOIN presets ON presets.id = tasks.id_preset

Однако перекрестное соединение будет означать, что каждая из ваших отфильтрованных явных соединенных строк объединяется с каждой строкой таблицы components. Последняя каждая строка будет выполнять

SET
components.value = pv2.value,
components.state = pv2.on_off

Я не верю, что это так или иначе предназначено. Подумайте дважды, действительно ли эта операция над декартовым произведением - это то, что вам нужно.

В components есть serial_number, поэтому вы, скорее всего, захотите

UPDATE     tasks
INNER JOIN presets       ON presets.id               = tasks.id_preset
INNER JOIN preset_values ON preset_values.id_preset  = presets.id
INNER_JOIN components    ON components.serial_number = preset_values.serial_number 

SET ...
0 голосов
/ 21 января 2019

вам нужно соединить tasks и components в предложении where. теперь они перекрестно соединены.

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