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

MySQL update the same table based on results of a select

我有一个名为 downloads 的 table,它记录了从各种 URL 下载的文件。有一列 downloads.createdDATETIME 和一列 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 来更新这些记录。

我要执行的SELECTUPDATE都适用于相同的tabledownloads

我尝试了以下 MySQL - UPDATE query based on SELECT Query :

UPDATE downloads 
(
    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)
 )
 SET master = 1

但这给出了一个错误:

Error : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '( SELECT t1.master FROM downloads t1 WHERE t1.id = (SELECT t2.id ' at line 2

我在上面 link 上尝试的其他解决方案更新了整个 table,因为我只是想更新从工作 SELECT 中检索到的记录。请有人帮我指明正确的方向吗?

试试这个

   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 t1 SET t1.master = 1  from downloads as  t1 
join downloads as  t2 
on t2.url_id = t1.url_id 
ORDER BY t2.created DESC LIMIT 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

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