2015-10-04 98 views
1

有沒有辦法顛倒整列?SQL顛倒整列

實施例:

ID ColX ColY ColZ 
0  001  010  100 
1  002  020  200 
2  003  030  300 

應爲:

ID ColX ColY ColZ 
0  003  030  300 
1  002  020  200 
2  001  010  100 

所以列ID應被反轉時,與最後一個ID的記錄應當是第一,第二持續所述第二第一等遠。

最新的值有ID = 0和最舊的ID = n,這必須完全相反,否則我不能插入新記錄。

+0

你的ID列有空白嗎? – fthiella

回答

1

您可以使用變量做到這一點:

SELECT t2.ID, ColX, ColY, ColZ 
FROM (SELECT ID, ColX, ColY, ColZ, 
      @row_number := @row_number + 1 AS rn 
     FROM mytable 
     CROSS JOIN (SELECT @row_number := 0) AS var 
     ORDER BY ID) AS t1 
INNER JOIN ( 
     SELECT ID, @rn := @rn + 1 AS rn   
     FROM mytable 
     CROSS JOIN (SELECT @rn := 0) AS var 
     ORDER BY ID DESC) AS t2 
ON t1.rn = t2.rn 
ORDER BY t2.ID 

Demo here

如果你想UPDATE那麼您可以在一個UPDATE聲明中這樣使用上面的查詢:

UPDATE mytable AS t 
INNER JOIN(
    SELECT ID, ColX, ColY, ColZ, 
      @row_number := @row_number + 1 AS rn 
    FROM mytable 
    CROSS JOIN (SELECT @row_number := 0) AS var 
    ORDER BY ID) AS t1 ON t.ID = t1.ID 
INNER JOIN ( 
     SELECT ID, @rn := @rn + 1 AS rn   
     FROM mytable 
     CROSS JOIN (SELECT @rn := 0) AS var 
     ORDER BY ID DESC) AS t2 ON t1.rn = t2.rn 
SET t.ID = t2.ID 

Demo here

無論ID列的值如何,以上都將工作。

+0

謝謝,它的工作! – LiooRyuuguu

0

如果你沒有在你的ID的差距,那麼你可以使用this select query

SELECT 
    max_id-ID AS ID, 
    ColX, 
    ColY, 
    ColZ 
FROM 
    mytable CROSS JOIN (SELECT MAX(ID) AS max_id FROM mytable) m 
ORDER BY 
    ID 

或本update query(但如果ID是不是一個主鍵,它只會工作):

UPDATE 
    mytable m1 CROSS JOIN (SELECT MAX(ID) as max_id FROM mytable) m 
SET 
    m1.ID = m.max_id - m1.ID 

,如果它是你可以使用這個主鍵:

UPDATE 
    mytable m1 CROSS JOIN (SELECT MAX(ID) as max_id FROM mytable) m 
    INNER JOIN mytable m2 ON m1.ID = m.max_id - m2.ID 
SET 
    m1.ColX = m2.ColX, 
    m1.ColY = m2.ColY, 
    m1.ColZ = m2.ColZ 

(請參閱它here

但是如果您的ID列有間隙(例如, 0,1,2,5,6)你需要一個不同的方法。

0
SELECT 
    @x - t.id AS new_id, 
    t.* 
FROM tab t, 
(SELECT @x:= max(id+1) FROM tab) m; 

MariaDB [tmp]> SELECT 
    -> @x - t.id AS new_id, 
    -> t.* 
    -> FROM tab t, 
    -> (SELECT @x:= max(id+1) FROM tab) m; 
+--------+----+--------+---------------------+ 
| new_id | id | action | date    | 
+--------+----+--------+---------------------+ 
|  7 | 1 |  2 | 2015-09-24 15:28:30 | 
|  6 | 2 |  4 | 2015-09-24 15:29:26 | 
|  5 | 3 |  2 | 2015-09-24 15:30:01 | 
|  4 | 4 |  3 | 2015-09-24 15:30:55 | 
|  3 | 5 |  1 | 2015-09-24 16:07:25 | 
|  2 | 6 |  5 | 2015-09-24 16:10:25 | 
|  1 | 7 |  4 | 2015-09-24 16:29:26 | 
+--------+----+--------+---------------------+ 
7 rows in set (0.00 sec)