2012-04-10 103 views
1

我想选择表中的行数,颠倒一列中的值并将它们重新插入到表中。下面是我在做什么的例子,说我有以下数据:在插入... select语句中插入增量值mysql

+-------+--------+-------+ 
| ORDER | X | Y | 
+-------+--------+-------+ 
| 0 | 12 | 5 | 
| 1 | 16 | 3 | 
| 2 | 19 | 2 | 
+-------+--------+-------+ 

我要选择它,并将其与反向,所以ORDER重新插入到相同的表:

+--------+--------+-------+ 
| PORDER | X | Y | 
+--------+--------+-------+ 
| 2  | 12 | 5 | 
| 1  | 16 | 3 | 
| 0  | 19 | 2 | 
+--------+--------+-------+ 

我能够复制行和使用插入重新插入,没有问题......选择这样的:

INSERT INTO myTable (porder, x, y) SELECT porder, x, y FROM myTable 

,但我没有成功扭转了订单。我曾尝试

INSERT INTO myTable (porder, x, y) SELECT (SELECT porder FROM myTable ORDER BY porder DESC), x, y FROM myTable but that throws an error 

这将是罚款,简单地忽略porder柱和0序列中(在我上面的例子2)插入新值最高的数字,但我不知道如何添加顺序数字在MySQL中的多行插入语句中。

我知道如何使用PHP这样做,但我想必须有一个更优雅的解决方案只是SQL

+0

什么是错误信息?你有没有想过使用临时表? 'CREATE TABLE TMP ...'。 'INSERT INTO TMP SELECT ... myTable'。 'DROP TABLE myTable'。 'RENAME TABLE TMP to myTable'。 – Basti 2012-04-10 00:35:05

回答

0

试试这个

INSERT INTO myTable(`porder`, x, y) SELECT (SELECT MAX(`porder`) FROM myTable) - `porder`, x, y FROM myTable 
+0

不幸的是,SELECT MAX导致它仅从每组点中选择1行。奇怪的是,它也返回了那一行的0波尔德,我本来预计它是2(波尔德最大2 - 波德尔0 = 2),但我会玩更多的这个,因为它似乎承诺 – MatthewLee 2012-04-10 15:55:05

+0

所以我给你的回答和@巴斯蒂都是有投票权的,因为结合2让我走上正轨。我不得不有第二个查询拉最大porder并将其分配给一个变量,所以不像我所希望的那么干净,但它的工作原理。如果有人有更优雅的解决方案,我会很高兴看到它。 – MatthewLee 2012-04-10 15:58:04

1

如果你知道order最大价值,你可以简单地做(假设max(order) = 2

UPDATE `myTable` SET `PORDER` = 2 - `PORDER` 

例子:

+--------+------------+ 
    | PORDER | 2 - PORDER | 
    +--------+------------+ 
    | 0  | 2-0 = 2 | 
    | 1  | 2-1 = 1 | 
    | 2  | 2-2 = 0 | 
    +--------+------------+ 
+0

不幸的是,我不知道最大值,它从案例变化,但谢谢。 – MatthewLee 2012-04-10 15:30:18

+0

然后在更新之前查询它。 – Basti 2012-04-10 15:33:37

+0

所以我使用了一个单独的查询来获取最大值,然后使用上面的@ nauphal解决方案。所以感谢你的想法! – MatthewLee 2012-04-10 15:57:58