1

テーブル内の複数の行を選択し、1 つの列の値を逆にしてテーブルに再挿入しようとしています。これが私がやっていることの例です。次のデータがあるとします:

+-------+--------+-------+
| 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だけでもっとエレガントなソリューションが必要だと思っていました

4

2 に答える 2

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   |
   +--------+------------+
于 2012-04-10T00:37:56.903 に答える
0

これを試して

    INSERT INTO myTable(`porder`, x, y) SELECT (SELECT MAX(`porder`) FROM myTable) - `porder`, x, y FROM myTable
于 2012-04-10T06:03:15.830 に答える