2016-12-20 35 views
2

我是MySQL的新手,所以我需要一些帮助。在MYSQL(?)中移动colums之间的值

我试图移动它们之间的3个不同的列值,但我不能让它正常工作

<?php 

include_once 'db_connect.php'; 
include_once 'psl-config.php'; 
include_once 'db_manual_connect.php'; 


$error_msg = ""; 
if (isset($_POST['value'], $_POST['id'])) { 
$value= $_POST['value']; 
$id = $_POST['id']; 

    if (!$conn) { 
     die("Connection failed: " . mysqli_connect_error()); 
    } 
    $sql = "UPDATE equipo SET 
    slot1= CASE WHEN slot1= '".$value."' THEN slot1 
        WHEN slot2= '".$value."' THEN slot2 
        WHEN slot3= '".$value."' THEN slot3 END, 

    slot2= CASE WHEN slot1= '".$value."' THEN slot2 
        WHEN slot2= '".$value."' THEN slot1 
        WHEN slot3 = '".$value."' THEN slot2 END, 

    pokemon3 = CASE WHEN slot1= '".$value."' THEN slot3 
        WHEN slot2= '".$value."' THEN slot3 
        WHEN slot3= '".$value."' THEN slot1 END WHERE id = '".$id."'"; 

    $result = mysqli_query($conn, $sql); 
+0

能否请您解释一下,*试图详细地3分不同的列值移动*多一点。请在更新之前给出一个数据的例子,以及它应该如何处理。 – Seb

+0

更新你的问题添加适当的数据样本和预期的结果 – scaisEdge

+0

MySQL不会那样工作。第二个'set'将使用已被覆盖的值。使用'更新...设置a = b,b = a',您将以两列中的列“b”的原始值结束。你可以通过使用额外的帮助栏来完成你的switcheroo;也可能需要先分开执行,然后在工作时将其合并。 – Solarflare

回答

0

你可以用这样的查询做到这一点。首先必须将slot1-3中的值保存在本地变量中,然后您可以测试并设置字段。

UPDATE theTable t 
CROSS join (SELECT @tmp_slot1:=0, @tmp_slot2:=0, @tmp_slot3:=0) AS init 
set 
    t.slot1 = @tmp_slot1 := t.slot1, -- save the val from slot1 into @tmp_slot1 
    t.slot2 = @tmp_slot2 := t.slot2, -- save the val from slot2 into @tmp_slot2 
    t.slot3 = @tmp_slot2 := t.slot3, -- save the val from slot3 into @tmp_slot3 

    t.slot1= CASE WHEN @tmp_slot1= '".$value."' THEN @tmp_slot1 
        WHEN @tmp_slot2= '".$value."' THEN @tmp_slot2 
        WHEN @tmp_slot3= '".$value."' THEN @tmp_slot3 END, 

    t.slot2= CASE WHEN @tmp_slot1= '".$value."' THEN @tmp_slot2 
        WHEN @tmp_slot2= '".$value."' THEN @tmp_slot1 
       WHEN @tmp_slot3 = '".$value."' THEN @tmp_slot2 END, 

    t.pokemon3 = CASE WHEN @tmp_slot1= '".$value."' THEN @tmp_slot3 
         WHEN @tmp_slot2= '".$value."' THEN @tmp_slot3 
         WHEN @tmp_slot3= '".$value."' THEN @tmp_slot1 END 
WHERE id = '".$id."'"; 

请让我知道它是否适合您。其尼特测试

样品有2场

mysql> SELECT * from theTable; 
+----+-------+-------+ 
| id | slot1 | slot2 | 
+----+-------+-------+ 
| 1 |  3 |  6 | 
| 1 |  6 | 12 | 
| 1 |  8 | 16 | 
| 2 |  5 | 10 | 
| 2 |  7 | 14 | 
+----+-------+-------+ 
5 rows in set (0,00 sec) 

mysql> update theTable t 
    -> CROSS join (SELECT @tmp_slot1:=0, @tmp_slot2:=0) AS init 
    -> set 
    ->  slot1 = @tmp_slot1 := slot1, 
    ->  slot2 = @tmp_slot2 := slot2, 
    ->  slot1 = @tmp_slot2, 
    ->  slot2 = @tmp_slot1; 
Query OK, 5 rows affected (0,00 sec) 
Rows matched: 5 Changed: 5 Warnings: 0 

mysql> SELECT * from theTable; 
+----+-------+-------+ 
| id | slot1 | slot2 | 
+----+-------+-------+ 
| 1 |  6 |  3 | 
| 1 | 12 |  6 | 
| 1 | 16 |  8 | 
| 2 | 10 |  5 | 
| 2 | 14 |  7 | 
+----+-------+-------+ 
5 rows in set (0,00 sec) 

mysql> 
+0

它的作品!谢啦兄弟! ^^ –