[英]order table when making an update
我有下表,其中按優先級順序排列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";
} ?>
我想要做的就是訂單的優先級,如果我更新act5
具有優先級5到優先級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 |
|---------|-----------|
我希望我能解釋清楚。 問候。
從您的代碼中,並不是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
我的意思是...基本上,您需要在“優先級”列中編輯排序順序編號。
您的優先級是主要的嗎? 或您的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注入
將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
這可以在數據庫內部全部實現。 請參閱以下示例證明:
首先是創建表並插入示例數據的無聊部分:
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,但是沒關系,我想,因為我提出的實現可以以“射擊,稍后再問”的方式安全地執行;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.