2012-04-10 14 views
1

Ich versuche, eine Reihe von Zeilen in einer Tabelle auszuwählen, die Werte in einer Spalte umzukehren und sie wieder in die Tabelle einzufügen. Hier ist ein Beispiel dafür, was ich tue, sagen, ich habe die folgenden Daten:Einfügen von inkrementellen Werten in einem Insert ... Select-Anweisung mysql

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

Ich möchte um es auszuwählen und sie in derselben Tabelle mit der ORDER wie so umgekehrt wieder einsetzen:

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

ich bin in der Lage, die Reihen zu kopieren und wieder einsetzen, kein Problem, einen Einsatz mit ... wählen wie folgt aus:

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

aber ich habe keinen Erfolg Umkehrung der Reihenfolge hatte. Ich habe versucht,

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

Es wäre schön, die PORDER Spalte einfach zu ignorieren und neue Werte von 0 bis die höchste Zahl in der Folge (2 in meinem obigen Beispiel) einsetzen, aber ich weiß nicht, wie sequenzielle hinzufügen Zahlen in einer mehrzeiligen INSERT-Anweisung in mysql.

Ich weiß, wie dies mit PHP zu tun, aber ich dachte, es muss eine elegantere Lösung in nur

SQL seine
+0

Was ist die Fehlermeldung? Haben Sie über die Verwendung einer temporären Tabelle nachgedacht? 'CREATE TABLE TMP ...'. 'EINFÜGEN IN TMP SELECT ... myTable'. 'DROP TABLE myTable'. 'RENAME TABLE TMP TO myTable'. – Basti

Antwort

0

versuchen, diese

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

Leider bewirkt SELECT MAX, dass nur eine Zeile aus jeder Menge von Punkten ausgewählt wird. Seltsamerweise hat es auch diese Reihe mit dem Porder von 0 zurückgegeben, ich hätte erwartet, dass es 2 ist (porter max von 2 - porder von 0 = 2), aber ich werde etwas mehr damit spielen, wie es scheint, Versprechen – MatthewLee

+0

zu haben, so gab ich Ihre Antwort und @ Basti ist eine Abstimmung, weil das Kombinieren der 2 mich auf die richtige Spur gebracht hat. Ich musste eine zweite Abfrage haben, um den Max-Porter zu ziehen und ihn einer Variablen zuzuordnen, also nicht ganz so sauber, wie es mir gefallen hätte, aber es funktioniert. Wenn jemand eine elegantere Lösung hat, würde ich mich freuen, sie zu sehen. – MatthewLee

1

Wenn Sie den max-Wert von order kennen, können Sie einfach tun (vorausgesetzt max(order) = 2)

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

Beispiel:

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

leider kenne ich das max nicht, es ändert sich von fall zu fall, aber danke. – MatthewLee

+0

Dann fragen Sie einfach nach, bevor Sie das Update durchführen. – Basti

+0

Also habe ich eine separate Abfrage verwendet, um den Maximalwert zu erhalten, und dann die obige Lösung von @nauphal verwendet. Also vielen Dank für die Idee! – MatthewLee

Verwandte Themen