MySQL:如何进行条件更新?

时间:2010-04-04 21:52:43

标签: mysql select

我正在尝试按以下几行创建更新语句:

TABLE car: id | owner_id | type | status

车主可以拥有多辆车。

UPDATE car c 
   SET c.type = 1 
     WHERE c.owner_id IN ($ids) 
     AND c.status = [1 IF THIS OWNER HAS A CAR WITH 1, ELSE A CAR WITH 0] // ... ???

$ ids相当小(低于50的值)。

看起来很简单,但我似乎无法理解它,因为我无法使用带有UPDATE的SELECT子查询到同一个表。

任何?

由于

1 个答案:

答案 0 :(得分:2)

你说你已经尝试了一个失败的查询,但遗憾的是你没有发布它,所以我猜它是这样的:

UPDATE car c 
SET c.type = 1 
WHERE c.owner_id IN ($ids) 
  AND c.status = (SELECT MAX(c2.status) FROM car c2 WHERE c.owner_id = c2.owner_id)

发布您的实际查询会有所帮助,但是现在我只是假设这是您尝试过的。如果你有一些不同的东西,那没关系......原理是一样的。它正如您正确指出的那样失败,因为您无法在一个查询中更新并从同一个表中进行选择。解决此错误的一种方法是将select包装在另一个select中:

UPDATE car c 
SET c.type = 1 
WHERE c.owner_id IN ($ids) 
  AND c.status = (SELECT * FROM
                    (SELECT MAX(c2.status) FROM car c2 WHERE c.owner_id = c2.owner_id)
                  AS T1)

令人惊讶的是,即使看起来它应该等同于第一个查询,这也会有效。请注意,原始查询不起作用的原因是因为它没有正确锁定表。这种解决方法欺骗MySQL无论如何都允许查询,但你应该知道在多用户环境中使用它可能是不安全的。