交换3行的行值

时间:2014-08-15 12:43:32

标签: php mysql sql

我必须在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 )

2 个答案:

答案 0 :(得分:2)

只用一个查询*就无法实现这一目标。

但是,您可以使用SQL事务(如果使用InnoDB) - 这样就可以保证数据的一致性。

start transaction;
select * from table for update;
... do the updates here...
commit;

for update关键字导致这些行被锁定(对于其他写入查询或其他for update查询),直到事务结束(所有其他查询将在转换之前看到状态或结果之后的结果)整个交易完成了。)

(*)您只需要更新4行(最多)。你要交换的两个和前面指向它们的两行。但是,为了知道您需要做哪些更新(一个或两个)选择查询 - 并且您需要一个事务来保持数据一致,因为至少在MySQL中,您不能将更新查询与选择子查询组合在一起同桌。

答案 1 :(得分:0)

最好在事务中包含多个更新。它是最干净的代码,它应该是可接受的快速。如果你坚持虽然......