使用子查询

时间:2015-11-30 15:06:42

标签: php mysql

我现在搜索了半天而没有找到任何答案。我希望有人能给我一个。

关于订单管理。我们的员工正在接受订单。由于其他一些原因,我们的数据库频率有点滞后。原始代码在第一个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

1 个答案:

答案 0 :(得分:0)

我不确定你的查询与较短的查询有什么关系。但是,您可以将较短的一个实现为:

UPDATE table t CROSS JOIN
       (SELECT field2 FROM table WHERE field = 0) t0
    SET t.field = t0.field2;