我正在尝试按以下几行创建更新语句:
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子查询到同一个表。
任何?
由于
答案 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无论如何都允许查询,但你应该知道在多用户环境中使用它可能是不安全的。