Настраиваемый порядок вывода из mysql

181
11 декабря 2017, 16:27

Есть таблица в MySQL с полями id(int,autoincrement), [много не относящихся к вопросу полей], pos(int).

Столбец pos всегда целое число по порядку 1,2,3.... По нему делается ORDER by pos и записи выводятся в нужном порядке. Необходимо реализовать настраиваемый порядок вывода записей.

Посоветуйте, пожалуйста, как реализовать 3 вещи:

  1. создание записи и помещение ее в позицию m $db->create($pos_m)
  2. перемещение записи по id из позиции m в n (старую позицию я знаю при запросе изначально) $db->move($id, $pos_n, $pos_m)
  3. удаление записи по id db->remove($id)

При этих действиях нужно, чтобы pos у всех остальных записей пересчитывался по порядку заново, чтобы не было разрывов. Если запись помещается в середину, все, что больше сдвигались на +1 и т.д. Pos всегда должен отражать реальный номер по порядку, а не как предложили делать тут.

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

Если есть возможность реализовать это на чистом SQL, здорово, но можно переложить часть работы на PHP и сделать несколько запросов.

Answer 1
  1. Вставка

    INSERT INTO mytable (pos) VALUES (:pos);
    UPDATE mytable SET
      pos = pos + 1
    WHERE
      pos => :pos AND
      id <> LAST_INSERT_ID();
    
  2. Перенос

    UPDATE mytable SET
      pos = pos + IF(:old_pos < :new_pos, -1, 1)
    WHERE
      pos BETWEEN :old_pos + 1 AND :new_pos OR
      pos BETWEEN :new_pos AND :old_pos - 1
    UPDATE mytable SET
      pos = :new_pos
    WHERE
      id = :id;
    
  3. Необходимость пересчитывать pos при удалении для меня под вопросом. Разрывы на сортировку не влияют. Но если нужно, то делается так

    UPDATE mytable SET
      pos = pos - 1
    WHERE
      pos > (SELECT pos FROM mytable WHERE id = :id);
    DELETE FROM mytable WHERE id = :id;
    

Все мои манипуляции подразумевают, что для поля pos не создан уникальный ключ

READ ALSO
Как отправить reCAPTCHA(google) с помощью ajax

Как отправить reCAPTCHA(google) с помощью ajax

Подскажите пожалуйста, как я могу отправить параметры рекапчи на сервер(php), с помощью ajaxНиже привел пример, как я думал, это сделать

154
Удаление данных из таблицы PHP

Удаление данных из таблицы PHP

Следующим кодом формируется таблица в html и выводятся данные из массива:

213
wxBitmap в текстуру.

wxBitmap в текстуру.

Создаю bitmap, пишу на нем строку, конвертирую в wxImage, и пытаюсь использовать как текстуру

221
Условие Edit Cintrol. Цвет текста. С++. MFC

Условие Edit Cintrol. Цвет текста. С++. MFC

Как сделать проверку, чтобы при вводе в Edit Control определенного значения, оно становилось красным и нельзя было нажать на кнопкуТо есть значение...

258