Php 在MySQL中是否可以只更新第n次发生的事件?

Php 在MySQL中是否可以只更新第n次发生的事件?,php,mysql,Php,Mysql,我的表有这样的数据 products_parent_id | products_quantity 2 5 2 7 2 9 2 4 到目前为止,我的SQL语句看起来像: UPDATE ' . TABLE_PRODUCTS . ' SET products_quantity = products_quantity +

我的表有这样的数据

  products_parent_id | products_quantity
        2               5
        2               7
        2               9
        2               4  
到目前为止,我的SQL语句看起来像:

UPDATE ' . TABLE_PRODUCTS . ' SET products_quantity = products_quantity +' . $order['products_quantity'] . ', products_ordered = products_ordered - ' . $order['products_quantity'] . ' WHERE products_parent_id = ' . (int)$order['products_id']
现在我想做的是,只更新第三次出现的products\u parent\u id在这种情况下,从顶部算起的第三次是9

为了选择第三个匹配项,我在我的语句末尾使用了这个选项:LIMIT$grade,1

是否有一种方法可以使用MySQL进行更新,但只能在第3次/4次/etc时更新?它可靠吗


谢谢

在使用单表引用的UPDATE时,您也可以使用LIMIT关键字,但是我自己没有测试过


来源:

您还可以使用记录计数子查询,如中所示

   Update Table T Set
     Col = value 
   Where (Select Count(*) From Table 
          Where products_quantity <= T.products_quantity)
          = 3
简短回答:没有

长答覆:

有点。因为SQL没有定义行的返回顺序。 从技术上讲,对DB的两个不同请求可能会以不同的顺序返回行。因此,即使您更新第三行,也将取决于实现

缓解这种情况的唯一方法是对行应用特定的顺序。订购人

我不认为这是语言规范的一部分,但大多数SQL实现允许您从查询中获取特定的行。我不确定MYSQL的具体细节是什么,但谷歌很快就看到了这个页面:


您的问题并没有使您进行此更新的原因完全清楚,但它确实让我想起了我在DB表中生成示例条目并希望将其中一小部分移动到类别a或类别B中的时候

您的SQL查询没有指定ORDER BY,因此Martin的回答是正确的,他说您可能不会每次都得到相同的结果顺序。但是,如果您的ORDER BY基于特定的ID,并且该ID是连续的,那么您将能够使用访问每三条记录

例如:

如果该方法对您有效,您可以使用

UPDATE [ ... ] WHERE id % 3 = 0 ;

更新,其中id/3的值为0。

这里的限制似乎只能限制受影响行的数量,而不会影响第n次出现。请记住,行在任何SQL数据库中都没有真正的顺序,它们只是碰巧保留了一个顺序。除非你在做一个ORDER BY,并且有某种等级列,否则这在大型或大量使用的数据库上可能是危险的。不幸的是,我的原因是由于一个设计拙劣且被黑客攻击的osCommerce,我不得不对其进行修改。我已经找到了一个解决方案,首先选择我想要的,获取它的产品id,然后使用UPDATE。效率低,但在这种情况下有效。感谢您的深入回答:
UPDATE [ ... ] WHERE id % 3 = 0 ;