按限制更新订单会给我一个错误

时间:2017-08-16 15:53:30

标签: mysql

我想使用order by和limit更新表。原因是我想要抵消前3个条目。我首先进行查询以列出我想要更新的内容,并且这样做有效。

SELECT `Name`,`active`
FROM `tlogon`
WHERE `active`>0 ORDER BY `id` LIMIT 3,18446744073709551610

所以我的表中有8个项目,显示最后3个是正确的,因为其中2个行的活动为零。所以我试着将我的选择变成这样的更新。

UPDATE `tlogon` SET `active`=3
WHERE `active`>0 ORDER BY `id` LIMIT 3,18446744073709551610

这里的想法是它获取active的列表并忽略前3个,然后我只想在前三个之后更新。但是上面的代码在phpmyadmin中给出了一个错误。

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '18446744073709551610' at line 2

所以我的问题是。为什么我的选择工作,但我的更新查询失败?

修改

好的我已经尝试了别的东西,但我又失败了。我的id是自动增量所以我尝试了下面的代码

UPDATE `tlogon` SET `active`=3
Where `id`>=(
    SELECT `id`
    FROM `tlogon`
    WHERE `active`>0 ORDER BY `id` LIMIT 3,1
)

现在它可以在模拟中运行,但是当我真实地做这个问题时我会遇到这个错误。

#1093 - You can't specify target table 'tlogon' for update in FROM clause

这很烦人,因为我正在做的是让第一个id高于我的极限并改变它们,但我又失败了。

那么我想到了像这样的正确加入

UPDATE `tlogon` AS `a`
RIGHT JOIN `tlogon` AS `b` ON `a`.`id`>`b`.`id`
SET `a`.`active`=3
WHERE (
   SELECT `id`
    FROM `b`
    WHERE `tlogon`.`active`>0 ORDER BY `tlogon`.`id` LIMIT 3,1 
 )

但我认为我做错了,因为现在告诉我表b不存在。

2 个答案:

答案 0 :(得分:1)

UPDATE语句不支持System.Diagnostics.ProcessStartInfo startInfo = new ProcessStartInfo(); System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo = startInfo; startInfo.FileName = "notepad"; process.Start(); startInfo.FileName = "excel"; process.Start(); 的偏移量,只支持要更新的行数。

它的语法是:

LIMIT

您需要找到另一种方法来忽略前3行。

答案 1 :(得分:0)

好的我有一个答案,但只有在使用自动递增ID时才有效。

UPDATE `tlogon` AS `a`
INNER JOIN
     (SELECT `id`
    FROM `tlogon`
    WHERE `active`>0 ORDER BY `id` LIMIT 3,1) as b  ON `a`.`id` >= `b`.`id`
SET `a`.`active`=3

因为你不能引用同一个表而我最终使用内部联接到同一个表。

基本上我在where子句中获得下一个最高ID,并且只有在id更高时才更改活动。因此,前三个条目将被忽略,其余条目将被更改为3,这就是我想要的。