我有下表,其中按优先级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 |
|---------|-----------|
我希望我能解释清楚。问候。
答案 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
答案 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有点相似,但是没关系,我想,因为我提出的实现可以在“射击时先执行,稍后再提问”中安全地执行。方式;)