我现在搜索了半天而没有找到任何答案。我希望有人能给我一个。
关于订单管理。我们的员工正在接受订单。由于其他一些原因,我们的数据库频率有点滞后。原始代码在第一个sql语句中选择了顺序,并在第二个sql语句中进行了更新。现在问题是,两个员工都得到了订单,但每个员工都应该得到不同的订单。因此,选择和更新必须在一个步骤中完成。
目标是动态选择表中的行并更新它。但是选择过程包括应该更新的表。所以我不能做这样的事情
UPDATE table SET field = (SELECT field2 FROM table WHERE field = 0)
因为在同一字段上进行过滤时设置表值是不可能的。我也使用ORDER BY,mutli表更新中不允许的内容(enter link description here)。
我有一个像这样的sql语句:
UPDATE t1
INNER JOIN (
SELECT t3.order_id
FROM t1
LEFT JOIN t3 USING(order_id)
WHERE t1.error = 0
AND t1.status = 0
AND t1.user_id = 0
ORDER BY t1.express DESC, t1.time_insert
) AS t2 USING(order_id)
SET t1.user = ' . mysql_real_escape_string($user->getId()) . ', t1.time_update = NOW()
我认为我已用该声明解决了问题,但我们的员工仍在支持这个问题。
有人知道是否还有任何竞争条件或其他原因吗?
请不要告诉我修复数据库延迟。我将不得不为此重新设计整个数据库。 ;)
感谢任何线索 DOPS
答案 0 :(得分:0)
我不确定你的查询与较短的查询有什么关系。但是,您可以将较短的一个实现为:
UPDATE table t CROSS JOIN
(SELECT field2 FROM table WHERE field = 0) t0
SET t.field = t0.field2;