【问题标题】:Intermediate MySQL query: updating table column based on separate table column value中间 MySQL 查询:根据单独的表列值更新表列
【发布时间】:2014-05-29 03:34:50
【问题描述】:

我有一个表 ticketdetails,其中包含一个包含我想复制到另一个表列的数据的列:

SELECT TicketID, MIN( StartTime ) StartTime
FROM ticketdetails
GROUP BY TicketID #might be unnecessary?
ORDER BY TicketID

输出如下:

我希望在我的另一个表列tickets.TimeScheduled 中提供此查询的结果“StartTime”,其中TicketID 与两个表匹配。

现在我正在尝试:

UPDATE tickets SET TimeScheduled = (
SELECT MIN( StartTime ) StartTime
FROM ticketdetails
GROUP BY TicketID
ORDER BY TicketID)
WHERE tickets.TicketID = ticketdetails.TicketID

我得到这个错误:

#1054 - Unknown column 'ticketdetails.TicketID' in 'where clause'

我知道此列存在于我的数据库中。由于某种原因,查询无法识别该列。我想我需要一个JOIN 或其他东西,但我不是最好的中高级 MySQL 查询。非常感谢您的帮助。

【问题讨论】:

  • 为什么您认为GROUP BY 可能没有必要?如果您不使用它,您将获得整个表格中的最短时间,而不是每张票的最短时间。
  • @Barmar 哇 --- 完全正确。我肯定会需要它

标签: mysql select sql-update


【解决方案1】:

使用连接:

UPDATE tickets AS t
JOIN (SELECT TicketID, MIN( StartTime ) StartTime
      FROM ticketdetails
      GROUP BY TicketID) AS d ON t.TicketID = d.TicketID
SET t.TimeScheduled = d.StartTime

您收到Unknown column 错误的原因是ticketdetails 表仅存在于子查询中,而不存在于主查询中。

如果您想将timeScheduled 设置为NULL,如果ticketdetails 中没有匹配的票证,请将JOIN 更改为LEFT JOIN

顺便说一句,子查询中不需要ORDER BY

【讨论】:

    【解决方案2】:

    您可以使用相关子查询来做到这一点:

    UPDATE tickets
        SET TimeScheduled = (SELECT MIN( td.StartTime ) StartTime
                             FROM ticketdetails td
                             WHERE td.TicketID = t.TicketID
                            );
    

    【讨论】:

    • 我看不出你在哪里定义t。应该是UPDATE tickets AS t
    • 您是否需要IFNULL 来处理ticketdetails 中没有匹配ID 的情况?
    • 很确定总有一个相关的值。即使StartTime 为空,我还是想把它复制过来
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多