php - 更新时的顺序表

标签 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 的优先级会改变code> 必须更改为 2,依此类推,直到 act4 更改为优先级 5。

如果我更新最后一个优先级,效果会很好。但是,如果我将 act4 更新为优先级 1,则以下内容不应更新,但它们会通过添加 +1 来更新(act5 优先级 5 为 6)。

如果我将 act4 更新为优先级 1,我希望得到类似的结果

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

我希望我解释得很好。问候。

最佳答案

从您的代码来看,并不能 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

关于php - 更新时的顺序表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52189679/

相关文章:

php - 使用 javascript 或一些外部网络编码语言运行 apt-get

php - 将混合字符串中的数字相乘

MySQL:按值优先级获取列

php - 为什么这段使用 MySQLi 的代码抛出 PHP Notice : trying to get property of non-object

php - mysql从任何距离参数返回相同的结果

php - CodeIgniter DB get_where 和 join

PHP XML-导出为文件下载

mysql - 查询 SELECT DISTINCT count()

mysql - 使用Logstash使用单个Elasticsearch Index同步来自两个mysql表的数据

mysql - 使用 GROUP BY 和 ORDER BY 优化计算中位数的查询