Данные сортируются по числовому полю в таблице, а дальше дофига запросов в бд когда мы меняем их

peon

Lok'tar ogar
Привет!

Например, есть фотогалерея. Из этой галереи фотографии выводятся на фронтенде в порядке возрастания по ассоциированному с ними полю `priority` которое хранит число.

У администратора есть возможность сортировать эти фотографии с помощью drag and drop, а на уровне БД меняются значения `priority`. Значит при каждом изменении положения одной фотографии, у всех фотографий меняются значения поля `priority`. То есть приходится выполнять UPDATE столко раз, сколько и фотографий в альбоме.

Это практический пример, возможно, знакомый каждому.

В этом у меня возникает вопрос: если у меня очень много данных в таблице сортируемых по `priority`, то каким путем решается эта проблема? Я же не буду плодить 1000 запросов к базе.

Спасибо за внимание.
 

Vano

Новичок
А что если... изменить поле с целочислового на дробное, и при перемещении картинки вынять с БД картинки соседи, и узнать среднее число между ними и записать для этой перемещаемой картинки среднее число.
 
  • Like
Реакции: AmdY

WMix

герр M:)ller
Партнер клуба
peon, вообщето достаточно обновить 2 строчки, одну в минус другую в плюс
 

WMix

герр M:)ller
Партнер клуба
тоже 2 запроса, промежуток в минус, запись в плюс
 
  • Like
Реакции: peon

WMix

герр M:)ller
Партнер клуба
А что если... изменить поле с целочислового на дробное, и при перемещении картинки вынять с БД картинки соседи, и узнать среднее число между ними и записать для этой перемещаемой картинки среднее число.
хватит на ~1074 перетаскивания далее придется нормализовать, короче не самый лучший способ
PHP:
$a = 0; $b = 1;
for($i = 0; $i<10000; $i++){
    $b = ($b+$a)/2;
    echo $i." ".$b."\n";
if ($b == 0.0) break;
}
 
  • Like
Реакции: Vano

IInkvizitor

Новичок
Как костыль- ночью в кроне можно менять дробные значения на целые с сохранением порядка
 

Vano

Новичок
тоже 2 запроса, промежуток в минус, запись в плюс
Можеш плз обьяснить?) интересно стало. Допустим 1000 картинок, айди пока-что по порядку идут. Берем 999ую перетаскиваем на 2ое место (или типа имеется ввиду что запроса только два, но все айди картинок в промежутке между 2 и 999 переписать надо? ну понятно же не форичом каждую картинку в БД изменять))0 или я чето не догнал?)
 

Vano

Новичок
Мой метод на столько же не идеален, как если создавать поле id (int) для пользователей. Ведь он вмещает в себя только 2 миллиарда, а население на планете 6млрд.)0)
 

WMix

герр M:)ller
Партнер клуба
Код:
$from_pos = select position from table where id=$id;
update table set position = position+1 where position >= $to_pos and position<$from_pos;
update table set position = $to_pos where id=$id;
 

AmdY

Пью пиво
Команда форума
WMix, зачем, у Vano, отличный вариант не требующий изменений других записей.
 

WMix

герр M:)ller
Партнер клуба
AmdY, я раньше тоже думал, что проще одну запись, но теперь думаю что и таким способом никаких проблем нет, зато задача решена полностью, она простая и всегда работает. знаешь, как nested sets, тебя же не пугает, что там также наборы меняются.

будут проблемы, решу с одной записью и последующей нормализацией
 
Сверху