У меня есть следующая таблица, где порядок по приоритету 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 (приоритет 5 act5 равен 6).
Что-то подобное хотелось бы, если я обновлю act4 до приоритета 1
----------------------
|priority |activity |
|---------|-----------|
| 1 |act4 |
| 2 |act1 |
| 3 |act2 |
| 4 |act3 |
| 5 |act5 |
|---------|-----------|
Надеюсь, я хорошо объяснил. Привет.
Я хочу изменить порядок таблицы номеров в базе данных, чтобы увидеть, что я заказываю таблицу с помощью ASC
Я получаю правильный порядок, хочу, чтобы я ПЕРЕЗАКАЗАЛ номера в базе данных
в базе данных mysql нет конкретного ПОРЯДОК записей. Порядок определяется только по выбранному запросу. Ваш вопрос не имеет смысла, как сейчас. Это то, что я пытаюсь вам объяснить
Я знаю, что я хочу, чтобы когда я обновил приоритет поля, я хочу изменить пример, если у меня есть эти данные в моей базе данных. act1 должен измениться на 1
У вас есть опечатка? resultt
Это просто задача: «Переместить X в начало списка»?






Я понял вашу точку зрения ... В основном вам нужно отредактировать номера порядка сортировки в столбце Priority ...
ваш приоритетный столбец является основным? или отдельный столбец идентификатора есть в вашей таблице mysql ..? если отдельный столбец первичного идентификатора не существует ... создайте его и сохраните этот столбец приоритета отдельно, чтобы вы могли изменять / обновлять номера сортировки в этом столбце ....
в вашем скрипте обновления 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-инъекции через этот код
столбец приоритета не является основным ИЛИ УНИКАЛЬНЫМ. Поищу ссылку
Пожалуйста, никогда не вводите данные пользователя напрямую в подобный запрос. Простая отправка priority = "1" и id [0] = "1" или "1 = 1" установит для приоритета все нулевое значение ...
После обновления 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 в вашем коде
Из вашего кода не на 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> 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. Поскольку мой пример является общим, я буду использовать внутренние переменные как для текущего, так и для нового приоритета для конкретного действия, тогда как в идеале вместо @activity_key и @new вы должны использовать свои переменные php при построении запроса:
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 |
+---------------+------+
Хорошо, мы готовы действовать. Первый самый интересный запрос - ОБНОВЛЕНИЕ с изменением приоритета.
Поскольку извлечение текущего приоритета из базы данных является ненужными накладными расходами и бесполезным обходом, я реализовал здесь третью переменную MySQL, названную @cur, которая содержит текущее значение, поэтому запрос обновления ниже будет знать, где и что нужно изменить. .
Мы выполняем два следующих запроса (УСТАНОВИТЬ @cur ... и ОБНОВИТЬ ...) вместе как один пакет. Это гарантирует, что ничего не изменится, если оно уже было изменено:
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 выше.
Обновлено: Я только что обнаружил, что мой ответ в чем-то похож на @nicks, но это нормально, я думаю, поскольку моя предложенная реализация может быть безопасно выполнена в стиле «стреляй первым, задавай вопросы позже»;)
Я думаю, вы путаете JSON с AJAX. Что касается порядка ... в Mysql нет концепции порядка. Просто, когда вы выбираете отображение таблицы, добавьте ORDER BY с приоритетом ASC, и он переупорядочит записи в соответствии с критериями порядка.