1

Тема: MYSQL: Перевпорядкування записів за приорітетом (зміна приорітету)

Доброго дня, шановні.

Дозвольте запитання. Є така таблиця:

CREATE TABLE `items` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(128) NOT NULL,
  `priority` TINYINT(1) UNSIGNED NOT NULLs
);

На сторінці є певний sortable інтерфейс, який зберігає у вбудованому dataSource всю зчитану з даної таблиці інформацію. Коли окремі елементи переміщуються, необхідно змінити їхній priority. Я можу передати на бекенд, всі id елементів у поточному порядку (після переміщення). Задача оновити поле priority в таблиці у відповідності до масиву id, що отримано з фронтенду. Чи можна цю операцію виконати одним запитом?

Бо якщо чесно, мені нічого не приходить на думку, окрім виконати стільки запитів UPDATE, скільки даних міститься у масиві... щось типу такого:

foreach ($ids as $i => $id) {
  DB::query('UPDATE `items` SET `priority` = '.$i.' WHERE `id` = '.$id)->execute();
}

Безмежно вдячний за конструктивні поради.

Подякували: 221VOLT1

2

Re: MYSQL: Перевпорядкування записів за приорітетом (зміна приорітету)

Ну хіба якщо використати цикл самого MySQL https://dev.mysql.com/doc/refman/5.7/en/loop.html
А більше мабуть ніяк. Але підніму репутацію тому, хто знайде ще якийсь вихід :)

Мій блог про ОС сімейства *nix - http://nixtravelling.blogspot.com/
Подякували: 221VOLT, leofun012

3 Востаннє редагувалося ktretyak (19.09.2016 20:49:37)

Re: MYSQL: Перевпорядкування записів за приорітетом (зміна приорітету)

Якщо даних не багато, то можна так зробити:

update items as i
set i.priority =
case id
    when 1 then 11
    when 2 then 22
    when 3 then 33
end
where id in (1, 2, 3)

Якщо багато - створюйте тимчасову таблицю, зв'язуйте її із цільовою таблицею і робіть оновлення.

Подякували: 221VOLT, Master_Sergius, bvn, leofun014

4

Re: MYSQL: Перевпорядкування записів за приорітетом (зміна приорітету)

ktretyak написав:

Якщо даних не багато, то можна так зробити:

update items as i
set i.priority =
case id
    when 1 then 11
    when 2 then 22
    when 3 then 33
end
where id in (1, 2, 3)

Якщо багато - створюйте тимчасову таблицю, зв'язуйте її із цільовою таблицею і робіть оновлення.

О, точно! Навіть якщо даних багато, то запит же можна згенерувати програмно.

Мій блог про ОС сімейства *nix - http://nixtravelling.blogspot.com/

5

Re: MYSQL: Перевпорядкування записів за приорітетом (зміна приорітету)

Сподіваюсь автор теми вибачить мені, за мою неввічливість :)

Чому в php доступ до БД тільки через синтаксис sql, або вже, в кращому випадку, - просто загорнутий в php функції. Чому нема таких красивих ORM, як напр. в Django на Python. Це ж набагато легше.

Я коли працював з джанго, а це близько року, то лише кілька разів заглядав у таблиці БД і взагалі не розбирався в цих join`нах. Проте, коли довелось працювати з php нічого іншого не було. І чесно кажучи мені в рази легше було модифікувати базу на python з орм...

Навчаюсь вчитись, щоб навчатись.

6

Re: MYSQL: Перевпорядкування записів за приорітетом (зміна приорітету)

ktretyak написав:

Якщо даних не багато, то можна так зробити:

update items as i
set i.priority =
case id
    when 1 then 11
    when 2 then 22
    when 3 then 33
end
where id in (1, 2, 3)

Якщо багато - створюйте тимчасову таблицю, зв'язуйте її із цільовою таблицею і робіть оновлення.

Excellent! Дякую!

Q-bart, ORM активно використовую там, де чітко зрозуміло, як він буде діяти і скільки запитів відсилати до БД. Бо це така штука, що коли її бездумно ліпити кругом, то вона може на великих базах все покласти... Хоча б і в моєму випадку, довелося б робити два кроки - спочатку отримати об'єкт, потім змінити і зберегти, а це зайвий SELECT.