Таблица заказов при обновлении

У меня есть следующая таблица, где порядок по приоритету 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       |
    |---------|-----------|

Надеюсь, я хорошо объяснил. Привет.

Я думаю, вы путаете JSON с AJAX. Что касается порядка ... в Mysql нет концепции порядка. Просто, когда вы выбираете отображение таблицы, добавьте ORDER BY с приоритетом ASC, и он переупорядочит записи в соответствии с критериями порядка.

Lelio Faieta 05.09.2018 18:26

Я хочу изменить порядок таблицы номеров в базе данных, чтобы увидеть, что я заказываю таблицу с помощью ASC

MoteCL 05.09.2018 18:36

Я получаю правильный порядок, хочу, чтобы я ПЕРЕЗАКАЗАЛ номера в базе данных

MoteCL 05.09.2018 19:18

в базе данных mysql нет конкретного ПОРЯДОК записей. Порядок определяется только по выбранному запросу. Ваш вопрос не имеет смысла, как сейчас. Это то, что я пытаюсь вам объяснить

Lelio Faieta 05.09.2018 19:20

Я знаю, что я хочу, чтобы когда я обновил приоритет поля, я хочу изменить пример, если у меня есть эти данные в моей базе данных. act1 должен измениться на 1

MoteCL 05.09.2018 19:26

У вас есть опечатка? resultt

Rick James 12.09.2018 14:33

Это просто задача: «Переместить X в начало списка»?

Rick James 12.09.2018 14:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
185
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я понял вашу точку зрения ... В основном вам нужно отредактировать номера порядка сортировки в столбце 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-инъекции через этот код

столбец приоритета не является основным ИЛИ УНИКАЛЬНЫМ. Поищу ссылку

MoteCL 05.09.2018 21:09

Пожалуйста, никогда не вводите данные пользователя напрямую в подобный запрос. Простая отправка priority = "1" и id [0] = "1" или "1 = 1" установит для приоритета все нулевое значение ...

Stratadox 10.09.2018 08:46

После обновления 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

Демонстрация SQLFiddle

Все это можно сделать в базе данных. См. Следующий пример доказательства:

Сначала скучная часть, где я создал вашу таблицу и вставил ваши образцы данных:

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, но это нормально, я думаю, поскольку моя предложенная реализация может быть безопасно выполнена в стиле «стреляй первым, задавай вопросы позже»;)

Другие вопросы по теме