我必须在php中做一个可以由用户重新排列的列表。这就是我想出的:
表格布局:
ID | Name | previous
1 | "first" | NULL
2 | "second" | 1
3 | "third" | 2
4 | "fourth" | 3
假设我想将“第三”与“第二”交换。查询后表格如下所示:
ID | Name | previous
1 | "first" | NULL
3 | "third" | 1
2 | "second" | 3
4 | "fourth" | 2
那会发生什么?
1)“第四”获得“第二”的价值(从3到2)。
2)“第三”获得“第二”的前一个值(从2到1)。
3)“第二个”得到“第四个”的前一个值(从1到3 ......显然与1有冲突),如果按顺序)。
我需要的是一个执行我刚刚解释过的查询。我不想使用多个查询,因此我想使用子查询。
我已经有一个SELECT语句,它为我提供了要更改的3行的所有数据......但是如何更新每行的列?:
SELECT * FROM test a
JOIN test b ON a.id = 3 AND b.id = ( SELECT id FROM test WHERE id < 3 ORDER BY id DESC limit 1 )
JOIN test c ON a.id = 3 AND c.id = ( SELECT id FROM test WHERE id > 3 ORDER BY id ASC limit 1 )
答案 0 :(得分:2)
只用一个查询*就无法实现这一目标。
但是,您可以使用SQL事务(如果使用InnoDB) - 这样就可以保证数据的一致性。
start transaction;
select * from table for update;
... do the updates here...
commit;
for update
关键字导致这些行被锁定(对于其他写入查询或其他for update
查询),直到事务结束(所有其他查询将在转换之前看到状态或结果之后的结果)整个交易完成了。)
(*)您只需要更新4行(最多)。你要交换的两个和前面指向它们的两行。但是,为了知道您需要做哪些更新(一个或两个)选择查询 - 并且您需要一个事务来保持数据一致,因为至少在MySQL中,您不能将更新查询与选择子查询组合在一起同桌。
答案 1 :(得分:0)
最好在事务中包含多个更新。它是最干净的代码,它应该是可接受的快速。如果你坚持虽然......