Php 更新和订购方式的使用不正确

Php 更新和订购方式的使用不正确,php,mysql,Php,Mysql,我编写了一些代码,用递减的数字序列更新表中的某些行。要选择正确的行,我必须连接两个表。表中最后一行的值必须为0,最后一行的值必须为-1,依此类推。为了实现这一点,我使用ORDER BY DESC。不幸的是,我的代码出现以下错误: 更新和订购方式的使用不正确 我的阅读表明我不能同时使用UPDATE、JOIN和orderby。我读到过子查询可能会有帮助?我真的不知道如何更改代码来实现这一点。也许有人可以发布一个可以使用的修改版本 while($row = mysql_fetch_array( $re

我编写了一些代码,用递减的数字序列更新表中的某些行。要选择正确的行,我必须连接两个表。表中最后一行的值必须为0,最后一行的值必须为-1,依此类推。为了实现这一点,我使用ORDER BY DESC。不幸的是,我的代码出现以下错误:

更新和订购方式的使用不正确

我的阅读表明我不能同时使用UPDATE、JOIN和orderby。我读到过子查询可能会有帮助?我真的不知道如何更改代码来实现这一点。也许有人可以发布一个可以使用的修改版本

while($row = mysql_fetch_array( $result )) {

$products_id = $row['products_id'];
$products_stock_attributes = $row['products_stock_attributes']; 

mysql_query("SET @i = 0");

$result2 = mysql_query("UPDATE orders_products op, orders ord

                   SET op.stock_when_purchased = (@i:=(@i - op.products_quantity)) 
                   WHERE op.orders_id = ord.orders_id 
AND op.products_id = '$products_id' 
AND op.products_stock_attributes = '$products_stock_attributes' 
AND op.stock_when_purchased < 0 
AND ord.orders_status = 2

ORDER BY orders_products_id DESC") 
or die(mysql_error());  
}
while($row=mysql\u fetch\u array($result)){
$products_id=$row['products_id'];
$products\u stock\u attributes=$row['products\u stock\u attributes';
mysql_查询(“SET@i=0”);
$result2=mysql\u查询(“更新订单\u产品操作,订单ord
在购买时设置op.stock\u=(@i:=(@i-op.products\u数量))
其中op.orders\U id=ord.orders\U id
和op.products\u id=“$products\u id”
和op.products_stock_attributes='$products_stock_attributes'
购买时的op.stock_<0
订单状态=2
按订单订购(产品名称描述)
或者死(mysql_error());
}

为什么在更新中需要订购人。我想你可以删除它,然后更新所有尊重where语句的内容


编辑:也许你可以调用一个存储过程来简化你的代码

你可以使用一个
SELECT
调用来循环行,包括
WHERE
ORDER BY
语句,然后在
while($row=mysql\u fetch\u assoc($query))中{
loop您应该让您的
updatetable设置key='value',其中id='{$row['id']}'
语句


当然,这需要大量执行
mysql\u query()
,但它仍然运行得非常快,只是速度与单个查询的速度不同。

只需在UPDATE语句中删除ORDER BY,然后将其放入SELECT语句中即可

样本:

$query = "SELECT ........ ORDER BY ..."
$result = mysql_query($query);

while(....){.... }

UPDATE语句不接受ORDER BY子句。

如果我不使用ORDER BY,我的数字序列将走错方向。UPDATE语句中的ORDER BY可用于确保在高并发环境中不会在行锁表上出现死锁。ORDER BY可用于修改对ens具有唯一约束的列确保您没有点击冲突的键。例如,如果您有一列作为优先级或序列,则可能需要将所有序列号递减到某个值以上。如果您按该列升序排序,则可以确保不会有重复的键。