我的表格有这样的数据
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']
现在我要做的是,更新只说第3次出现的products_parent_id(在这种情况下,从顶部开始的第3次是9)
要选择第3次出现,我在语句末尾使用了这个LIMIT($ grade,1)
有没有办法使用MySQL进行UPDATE,但只有第3 /第4 / etc次出现?它会可靠吗?
谢谢
答案 0 :(得分:5)
简答:否
长答案:
排序。因为返回行的顺序不是由SQL定义的 从技术上讲,对DB的两个不同请求可以以不同的顺序返回行。所以即使你更新了第三行,第三行也将取决于实现。
缓解此问题的唯一方法是对行应用特定排序。 (订购)
我不认为它是语言规范的一部分,但大多数SQL实现允许您从查询中获取特定行。我不确定MYSQL的具体细节是什么,但快速谷歌得到了这个页面:
答案 1 :(得分:2)
您的问题并没有让您完全明白此更新的原因,但它确实提醒我何时在数据库表格中生成示例条目并希望将其中的一小部分移至A类或B类
您的SQL查询未指定ORDER BY,因此Martin的答案是正确的,即您每次都可能无法获得相同的结果顺序。但是,如果您的ORDER BY基于特定ID,并且该ID是连续的,则您可以使用modulo访问每个第三条记录。
例如:
mysql> create table foo ( id int ) ;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into foo values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (15) ;
Query OK, 12 rows affected (0.00 sec)
Records: 12 Duplicates: 0 Warnings: 0
mysql> select * from foo where id%3=0;
+------+
| id |
+------+
| 3 |
| 6 |
| 9 |
| 15 |
+------+
4 rows in set (0.00 sec)
如果该方法适用于您,您可以使用
执行更新以命中每三个条目UPDATE [ ... ] WHERE id % 3 = 0 ;
(更新,其中id / 3的remainder为0)。
答案 2 :(得分:0)
在将UPDATE与单表引用一起使用时,也可以使用LIMIT关键字,但我自己没有测试过。
答案 3 :(得分:0)
您还可以使用记录计数子查询,如
Update Table T Set
Col = value
Where (Select Count(*) From Table
Where products_quantity <= T.products_quantity)
= 3