进行更新时订购表

时间:2018-09-05 16:21:57

标签: php mysql

我有下表,其中按优先级ASC排序

 ----------------------
|priority |activity   |
|---------|-----------| 
|   1     |act1       |
|   2     |act2       |
|   3     |act3       |
|   4     |act4       |
|   5     |act5       |
|---------|-----------|

我在其中进行更新的JSON。

添加方法,但无法正常运行

  <?php
      //update.php
      include_once('../include/conexion.php');

        $query = "
               UPDATE ACT_schedule SET ".$_POST["name"]." = '".$_POST["value"]."'
               WHERE id_schedule = '".$_POST["pk"]."'";
            $result=mysqli_query($conn, $query);

            if ($result) {
            $query2 = "UPDATE ACT_Agenda SET prioridad = CASE 
                   WHEN prioridad >= " . $_POST['value'] . "
                   THEN prioridad + 1 ELSE prioridad  END
                   WHERE id_agenda <> '" . $_POST['pk'] . "'";
            mysqli_query($conn, $query2);
            echo "YES";
        }  ?>

我想做的是对优先级进行排序,如果我将优先级5的act5更新为优先级1,则优先级将更改,这意味着act1的优先级必须更改为2等等,直到act4更改为优先级5。

如果我更新了最后的优先级,它会很好地工作。但是,如果我将act4更新为优先级1,则不应更新以下内容,而是通过添加+1(act5优先级5为6)来实现。

如果我将act4更新为优先级1,我会想要的东西

   ----------------------
    |priority |activity   |
    |---------|-----------|
    |   1     |act4       |
    |   2     |act1       |
    |   3     |act2       |
    |   4     |act3       |
    |   5     |act5       |
    |---------|-----------|

我希望我能解释清楚。问候。

4 个答案:

答案 0 :(得分:4)

根据您的代码,尚不清楚100%可以在更新查询中使用哪些合适的$_POST变量,因此这是一个纯MySQL解决方案。首先创建演示表:

CREATE TABLE agenda (`priority` int, `activity` varchar(4)); 
INSERT INTO agenda (`priority`, `activity`)
  VALUES (1, 'act1'), (2, 'act2'), (3, 'act3'), (4, 'act4'), (5, 'act5');
SELECT * FROM agenda ORDER BY priority;

输出:

priority    activity
1           act1
2           act2
3           act3
4           act4
5           act5

要更新,请使用以下查询。我将变量@n用于新的优先级,并将@a用于修改的活动。在您的PHP代码中,您将删除下面的SET语句,并用适当的@n值替换更新查询中的@p$_POST。在此示例中,我将act4转换为优先级2:

SET @a = 'act4';
SET @n = 2;
UPDATE agenda SET priority = CASE WHEN priority BETWEEN @n AND (SELECT * FROM (SELECT priority FROM agenda WHERE activity=@a) a) AND activity != @a THEN priority + 1 
                                  WHEN activity = @a THEN @n
                                  ELSE priority
                             END;

现在我们可以看一下修改后的表:

SELECT * FROM agenda ORDER BY priority;

输出:

priority    activity
1           act1
2           act4
3           act2
4           act3
5           act5

SQLFiddle Demo

答案 1 :(得分:0)

我明白了...基本上,您需要在优先级列中编辑排序顺序编号

您的首要职位是首要的吗?或您的mysql表中有单独的id列。如果不存在单独的主ID列。请创建它,并将此优先级列保持单独,以便您可以更改/更新此列中的排序编号。...

在您的Ajax更新脚本中..即,... updatePriorityJSON.php ....您将需要类似以下代码。 这没有经过测试..但是作为示例给出...

for($i=0; $i<count($_POST["priority"]); $i++) {
   $query = "
     UPDATE table
     SET priority = '".$i."' 
     WHERE id = '".$_POST["id"][$i]."'";
 }

更多关于教程的观点,请查看https://www.webslesson.info/2017/06/sorting-table-row-using-jquery-drag-drop-with-ajax-php.html?m=1

请注意防止通过此代码进行任何SQL注入

答案 2 :(得分:0)

act5优先级更新为1:(*)

UPDATE ACT_Agenda SET priority = 1 WHERE activity = 'act5';  

检查以查看其他需要更新的记录:

SELECT * FROM ACT_Agenda WHERE priority >= 1 AND activity <> 'act5';

然后更新优先级:(*)

UPDATE ACT_Agenda SET priority = priority+1 WHERE priority >= 1 AND activity <> 'act5';

(*)的最后一步是将sql实现到您的代码中

答案 3 :(得分:0)

这可以在数据库内部全部实现。请参阅以下示例证明:

首先是创建表并插入示例数据的无聊部分:

mysql> CREATE TABLE priority_demo (priority SMALLINT UNSIGNED, activity VARCHAR(4));
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO priority_demo VALUES (1, 'act1');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO priority_demo VALUES (2, 'act2'), (3, 'act3'),(4, 'act4'), (5,'act5');
Query OK, 4 rows affected (0.02 sec)

mysql> SELECT * FROM priority_demo; 
+----------+----------+
| priority | activity |
+----------+----------+
|        1 | act1     |
|        2 | act2     |
|        3 | act3     |
|        4 | act4     |
|        5 | act5     |
+----------+----------+
5 rows in set (0.00 sec)

现在,作为示例,我将act4(当前为prio 4)的优先级更改为新值2。由于我的示例是通用示例,因此我将为特定活动的当前优先级和新优先级使用内部变量,而理想情况下,在构造查询时,请使用php变量代替@activity_key和@new:

mysql> SET @activity_key := 'act4', @new = 2; -- variables from php
Query OK, 0 rows affected (0.00 sec)

出于演示目的,我也将其输出:

mysql> SELECT @activity_key, @new; -- variables used below
+---------------+------+
| @activity_key | @new |
+---------------+------+
| act4          |    2 | 
+---------------+------+

好的,我们现在准备采取行动。 首先是最有趣的查询-具有优先级更改的UPDATE。

由于将当前优先级从数据库中拉出是不必要的开销和无用的往返,因此我在这里实现了第三个MySQL变量,称为 @cur ,它包含当前值,因此更新下面的查询将知道是否以及在何处以及要进行什么更改。

我们将以下两个查询( SET @cur ... UPDATE ... )作为一个批处理一起运行。这样可以确保它不会更改任何已更改的内容:

mysql> -- both in one "batch"

-> SET @cur := (SELECT priority FROM priority_demo WHERE activity=@activity_key LIMIT 1); 
-> UPDATE priority_demo SET priority=CASE 
->   WHEN priority >= @new AND priority < @cur THEN priority+IF(@cur<>@new, 1,0) 
->   WHEN activity = @activity_key THEN @new ELSE priority END;

Query OK, 0 rows affected (0.00 sec)
Rows matched: 5  Changed: 0  Warnings: 0

让我们看看结果:

mysql> SELECT * FROM priority_demo;  -- result as is
+----------+----------+
| priority | activity |
+----------+----------+
|        1 | act1     |
|        3 | act2     |
|        4 | act3     |
|        2 | act4     |
|        5 | act5     |
+----------+----------+
5 rows in set (0.00 sec)

mysql> SELECT * FROM priority_demo ORDER BY priority; -- priority ordered view
+----------+----------+
| priority | activity |
+----------+----------+
|        1 | act1     |
|        2 | act4     |
|        3 | act2     |
|        4 | act3     |
|        5 | act5     |
+----------+----------+
5 rows in set (0.00 sec)

即使您再次重新运行查询,它也不会更改任何内容。这是因为上面的UPDATE的 IF(...)部分。

编辑:我刚刚发现我的答案与@nicks有点相似,但是没关系,我想,因为我提出的实现可以在“射击时先执行,稍后再提问”中安全地执行。方式;)