【问题标题】:MySQL UPDATE - Selective updateMySQL UPDATE - 选择性更新
【发布时间】:2011-04-07 00:55:04
【问题描述】:

首先,为这个糟糕的标题道歉,我想不出更好的方式来表达我的问题。 (欢迎提出更好的替代方案)

基本上我有一个带有“计数”列的表。 我想将所有计数重置为零,但具有最高值的 10 行除外。我希望将它们重置为 0。

如何在不编写多个查询的情况下实现这一目标?

更新 我现在有如下查询

UPDATE covers AS t1 
  LEFT JOIN (SELECT t.cover_id 
               FROM covers t 
               ORDER BY t.cover_views DESC 
               LIMIT 10) AS t2 ON t2.id = t.id
   SET cover_views = 0
   WHERE t2.id IS NULL

我收到错误 #1054 - Unknown column 't2.id' in 'where clause' - 知道为什么吗?

我也尝试了以下相同的结果

UPDATE covers t1 
  LEFT JOIN (SELECT t.cover_id 
               FROM covers t 
               ORDER BY t.cover_views DESC 
               LIMIT 10) t2 ON t2.id = t.id
   SET t1.cover_views = 0
   WHERE t2.id IS NULL

【问题讨论】:

  • 是否有 id 列或 Primary Key 列?
  • @Chris...看起来@Wadhi 已经回答了。

标签: php mysql sql sql-update mysql-error-1054


【解决方案1】:

您可以使用子查询:

update A set count = 0 where A.id not in 
(select id from A order by count desc limit 10)

【讨论】:

  • MySQL 错误 1093 - 无法在 FROM 子句中指定要更新的目标表。欲了解更多信息,请参阅:stackoverflow.com/questions/3620940/…
  • @OMG Ponies:感谢 OMG Ponies。您将如何更正代码?
  • 如果您在 UPDATE 和返回数据的子查询之间放置一个子查询,MySQL 将接受它 - 我提供的链接中有一个示例。
【解决方案2】:

用途:

UPDATE TABLE t1 
  LEFT JOIN (SELECT t.id 
               FROM TABLE t 
           ORDER BY t.id DESC 
              LIMIT 10) t2 ON t2.id = t1.id
   SET TABLE.count = 0
 WHERE t2.id IS NULL

【讨论】:

  • 谢谢,这看起来很完美,无论如何我可以在同一个查询中将连接表中的所有设置为 1,还是我必须做另一个?
  • 我在执行您的查询时遇到了一个小问题 - 我更新了问题 - 请您看看好吗?
  • 注意 t.id desc limit 10 的顺序 - 你确实说过“我想将所有计数重置为零,除了具有最高值的 10 行”所以也许应该按顺序 desc 限制 10
  • @chris:这是因为 JOIN 中的拼写错误 - LIMIT 10) t2 ON t2.id = t.id 应该是:LIMIT 10) t2 ON t2.id = t1.id。我更正了我的答案。
  • 啊,干杯,我标记了你的答案,但已经接受了 f00 的'因为它首先起作用。无论如何感谢您的帮助。
【解决方案3】:

尝试:

update <table> t 
left outer join 
(
select id from <table> order by <counter> desc limit 10
) c on c.id = t.id 
set 
 <counter> = 0
where 
 c.id is null;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2013-01-25
    • 2014-08-26
    • 2019-01-11
    • 1970-01-01
    • 2011-07-31
    • 2014-03-30
    相关资源
    最近更新 更多