首页 > 解决方案 > 如何从选择查询更新另一个表中的列?

问题描述

我想从查询结果中更新另一个表中的某些列。我不断收到错误。请帮忙。

Update customer_info
set customer_info.reader_ID     = aisle_info.reader_ID,
    customer_info.tag_no        = tag_logs.tag_no,
    customer_info.area          = aisle_info.area,
    customer_info.max_timestamp = TIMESTAMPDIFF(SECOND,MIN(tag_logs.timestamp),MAX(tag_logs.timestamp)) 

FROM tag_logs
INNER join aisle_info ON tag_logs.reader_ID = aisle_info.reader_ID
WHERE T.tag_no = 515988190124;

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在“FROM tag_logs”附近使用正确的语法

INNER join aisle_info ON tag_logs.reader_ID = aisle_info.reader_I' 在第 5 行

标签: mysqlsql

解决方案


你很亲密。不同的数据库对来自 select/join 的更新的语法略有不同。将 MySQL 视为一个 select 语句,并使用您尝试更新的主表的别名,然后是 SET 子句。

所以我首先要自己编写 SELECT 查询。

select
      CI.Tag_No,
      AI.Reader_ID,
      AI.Area,
      MIN( TL.TimeStamp ) MinTime,
      MAX( TL.TimeStamp ) MaxTime
   from
      customer_info CI
         join tag_logs TL
            CI.tag_no = TL.tag_no
            join aisle_info AI
               on TL.Reader_ID = Reader_ID
   WHERE 
      CI.tag_no = 515988190124
   group by
      CI.Tag_No,
      AI.Reader_ID,
      AI.Area

所以这给了我们你想要的最终结果,你可以根据需要进行确认。

然后应用您的更新,例如

update Customer_Info CIUpd
   JOIN 
   ( select
          CI.Tag_No,
          AI.Reader_ID,
          AI.Area,
          MIN( TL.TimeStamp ) MinTime,
          MAX( TL.TimeStamp ) MaxTime
       from
          customer_info CI
             join tag_logs TL
                CI.tag_no = TL.tag_no
                join aisle_info AI
                   on TL.Reader_ID = Reader_ID
       WHERE 
          -- notice your filter is HERE for the one tag_no you want to update
          -- and will result with only this on TAG_NO set of values returned
          CI.tag_no = 515988190124
       group by
          CI.Tag_No,
          AI.Reader_ID,
          AI.Area ) FirstQuery
      -- the JOIN will ensure updating only on that one tag_no
      ON CIUpd.Tag_No = FirstQuery.Tag_No
   set
      CIUpd.Reader_ID = FirstQuery.Reader_ID,
      CIUpd.Area = FirstQuery.Area,
      CIUpd.Max_TimeStamp = TimeStampDiff( second, FirstQuery.MinTime, FirstQuery.MaxTime )

现在这不是一个完美的答案,因为您的原始查询不是使用 MIN() / MAX() 上下文的正确查询。进行聚合查询时,您需要对所有非聚合列应用分组依据。在这种情况下,您没有说明 Reader_ID 和 Area 上的任何此类组考虑因素,这可能导致 tag_logs 和 aisle_info 表中的多行。

如果给定 Tag_No 的通道信息始终相同,那么这很简单,只需跳过对其进行分组并将这些列检索值更改为每个 MAX()。如果它们从不更改,则 MAX() 甚至 MIN() 将始终返回相同的值,并且没有非聚合列的聚合查询不会出现问题。

如果您可以对数据、目的等提供额外的说明,请编辑您的原始帖子而不是仅发表评论。然后给我留下评论,请查看更新的信息。


推荐阅读