2010-09-01 50 views
0

首先,为可怕的标题道歉,我想不出一个更好的方式来表达我的问题。 (随意建议更好的替换)MySQL更新 - 选择性更新

基本上我有一个“计数”列的表。 我想将所有计数重置为零,除了具有最高值的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 
+0

是否有ID列或主键列? – MikeTWebb 2010-09-01 21:22:17

+0

是的,主键 – Chris 2010-09-01 21:25:46

+0

@Chris ...看起来像@Wadhi已经回答了。 – MikeTWebb 2010-09-01 21:27:06

回答

1

尝试:

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; 
+0

这工作,谢谢! – Chris 2010-09-01 22:53:05

0

您可以使用子查询如下:

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

MySQL错误1093 - 无法在FROM子句中为更新指定目标表。欲了解更多信息,请参阅:http://stackoverflow.com/questions/3620940/deleting-a-row-based-on-the-max-value/3621005#3621005 – 2010-09-01 21:22:34

+0

@OMG小马:感谢OMG小马。你会如何纠正代码? – 2010-09-01 21:25:56

+0

如果您在UPDATE和返回数据的子查询之间放置子查询,MySQL将接受它 - 在我提供的链接中有一个示例。 – 2010-09-01 21:28:19

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 
+0

感谢这看起来很完美,无论如何,我可以将所有从连接表中设置为1在同一个查询或我必须做另一个? – Chris 2010-09-01 22:40:52

+0

我遇到了一个小问题,执行您的查询 - 我更新了问题 - 请您看看吗? – Chris 2010-09-01 22:49:52

+0

注意t.id desc limit 10的顺序 - 你确实说过“我想将所有计数重置为零,除了最高值的10行”,所以也许这应该是 desc limit order 10 – 2010-09-01 22:50:32