MySQL根据select的结果更新相同的表

MySQL根据select的结果更新相同的表,mysql,sql,mariadb,Mysql,Sql,Mariadb,我有一个名为downloads的表,其中记录了从各种URL下载的文件。有一列downloads.created(日期时间)和一列downloads.master(布尔值字段),用于说明哪个记录是主副本 以下查询成功获取具有最新日期的记录: SELECT t1.master FROM downloads t1 WHERE t1.id = (SELECT t2.id FROM downloads t2 WHERE t2.url_id = t1.ur

我有一个名为downloads的表,其中记录了从各种URL下载的文件。有一列downloads.created(日期时间)和一列downloads.master(布尔值字段),用于说明哪个记录是主副本

以下查询成功获取具有最新日期的记录:

SELECT t1.master
FROM downloads t1
WHERE t1.id = (SELECT t2.id
             FROM downloads t2
             WHERE t2.url_id = t1.url_id            
             ORDER BY t2.created DESC
             LIMIT 1)
我想通过将master设置为1来更新这些记录

我要执行的选择和更新都应用于同一个表,即下载

我尝试了以下方法:

但这会产生一个错误:

错误:您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以了解使用near'的正确语法 选择t1.master 从t1下载 其中t1.id=选择t2.id “在2号线

我在上面链接上尝试的其他解决方案更新了整个表,因为我只是尝试更新从工作选择中检索到的记录。有人能帮我指出正确的方向吗?

试试这个

   UPDATE downloads 
    SET master = 1
    FROM
    (
        SELECT t1.master
        FROM downloads t1
        WHERE t1.id = (SELECT t2.id
                 FROM downloads t2
                 WHERE t2.url_id = t1.url_id            
                 ORDER BY t2.created DESC
                 LIMIT 1)
     )
试试这个

   UPDATE downloads 
    SET master = 1
    FROM
    (
        SELECT t1.master
        FROM downloads t1
        WHERE t1.id = (SELECT t2.id
                 FROM downloads t2
                 WHERE t2.url_id = t1.url_id            
                 ORDER BY t2.created DESC
                 LIMIT 1)
     )
使用连接

使用连接


您需要同时使用join和update来执行类似的操作。试一试

  UPDATE downloads d
  JOIN (SELECT t1.id FROM downloads t1 
        WHERE t1.id = (SELECT t2.id
                       FROM downloads t2
                       WHERE t2.url_id = t1.url_id            
                       ORDER BY t2.created DESC LIMIT 1
                       ) 
        ) a on d.id = a.id  SET d.`master` = 1

这应该行得通,也许您可以进一步优化提取最新记录的方式

您需要同时使用“连接和更新”来执行类似的操作。试一试

  UPDATE downloads d
  JOIN (SELECT t1.id FROM downloads t1 
        WHERE t1.id = (SELECT t2.id
                       FROM downloads t2
                       WHERE t2.url_id = t1.url_id            
                       ORDER BY t2.created DESC LIMIT 1
                       ) 
        ) a on d.id = a.id  SET d.`master` = 1

这应该行得通,也许您可以进一步优化提取最新记录的方式

了解更新。。。JoinUpdate的条件是什么?@PriyeshKumar该条件是将master=1设置,但我只想对SELECT语句返回的记录执行该操作,而不是对整个表执行该操作。update语句适用于表,而不是SELECT语句的结果。此外,您无法从正在更新的表中进行选择,因此请按照@Jens的建议使用联接。update t1.master SET t1.master=1其中t1.id=select t2.id from downloads t2 where t2.url\u id=t1.url\u id ORDER BY t2.created DESC LIMIT 1 read about update。。。JoinUpdate的条件是什么?@PriyeshKumar该条件是将master=1设置,但我只想对SELECT语句返回的记录执行该操作,而不是对整个表执行该操作。update语句适用于表,而不是SELECT语句的结果。此外,您不能从正在更新的表中进行选择,因此,按照@Jens的建议使用连接。更新t1.master SET t1.master=1,其中t1.id=SELECT t2.id从下载中选择t2.id,其中t2.url\u id=t1.url\u id按t2排序。created DESC LIMIT 1不幸出错-SQL语法中有错误;查看与您的MariaDB服务器版本对应的手册,以了解可使用的正确语法near'from给出了一个错误,不幸的是,您的SQL语法中有一个错误;查看与您的MariaDB服务器版本对应的手册,以了解可使用的正确语法。如果“from”给出错误错误:您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解在第1行的“WHERE t1.id=SELECT t2.id FROM downloads t2 WHERE t2.url\u id=t1.url\u id”附近使用的正确语法。首先,没有主表。重新阅读原始帖子-我从中选择并更新的表称为下载。我试图更新的字段是downloads.master,只需将master更改为downloads即可。现在就试试吧我更新了我的答案@AndyGives一个错误:您的SQL语法有一个错误;检查与您的MariaDB服务器版本相对应的手册,以了解在第1行的“WHERE t1.id=SELECT t2.id FROM downloads t2 WHERE t2.url\u id=t1.url\u id”附近使用的正确语法。首先,没有主表。重新阅读原始帖子-我从中选择并更新的表称为下载。我试图更新的字段是downloads.master,只需将master更改为downloads即可。现在试试我更新了我的答案@Andy