【问题标题】:UPDATE INNER JOIN unknown column in on clauseUPDATE INNER JOIN on 子句中的未知列
【发布时间】:2019-01-21 19:14:03
【问题描述】:

我知道这个问题已经有了一些答案,但它们似乎都不适合我。

基本上,我的任务只不过是随着时间推移而安排的预设:我想在截止日期前更新任务日期;另外,当我到达最后期限时,我需要根据预设值更新组件表的值。

我成功进行了查询以更新如下所示的截止日期:

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 说:文档

1054 - “on 子句”中的未知列“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

EDIT :三思而后行,我选择了两个单独的更新查询。它目前看起来像这样。如果有人有一个单一的更新解决方案,如果它的性能更好,我会很高兴使用它。否则我会暂时坚持这个解决方案。谢谢大家的热心帮助。

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

【问题讨论】:

  • 当前的错误信息是什么?
  • 错误unknown column in on clause 应该告诉你所有。由于您没有公开表结构,因此没有人可以猜测您的 on 子句中的 6 个字段名称中的哪一个是错误的。通常错误消息是:“错误代码:1054。'on 子句'中的未知列 'column_name'
  • 我更新了我的问题。我很抱歉一开始就很不清楚。谢谢各位

标签: mysql phpmyadmin


【解决方案1】:

如果出于某种原因确实需要交叉连接(极不可能),则应使用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) ...

显然components INNER JOIN presets ON presets.id = tasks.id_preset中没有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 ...

【讨论】:

  • 经过深思熟虑后,我选择执行两个单独的更新查询。我更新了我的帖子。谢谢您的帮助。事实上,我所做的并不是我所需要的。
  • @MatthieuLormeau 通常做一个 SELECT * 而不是 UPDATE 看看你得到什么。然后转换为 UPDATE 设置所需的字段/值。
【解决方案2】:

您需要在 where 子句上连接 taskscomponents。现在,它们是交叉连接的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多