Переупорядочение заказанного списка

У меня есть следующая таблица SQL с данными

ProductList 
id  order productname
79   1     name1
42   2     name2
67   3     somename
88   4     othername
99   5     XYZ
66   6     ABC

Порядок дисплея очень энергозависим, он будет часто изменяться, пользователи добавят или удалят объекты и переупорядочат объекты.

Как я должен обработать эту ситуацию, не обновляя несколько записей. Пример: если пользователь вводит новый продукт между 1 и 2 порядками, я не хочу обновлять порядок всех записей под 2 и если кто-то переключает порядок 3 - 4, я не хочу обновлять каждую запись под 3.

7
задан nin 2 February 2012 в 14:34
поделиться

6 ответов

Используйте «ужасный старый трюк, ставший знаменитым (?) Старыми кодировщиками BASIC - установите ваши заказы на 100, 200, 300, 400 и т. Д., А затем вы можете выбрать« промежуточный »порядок, когда вам нужно. Это может вызвать беспорядок - и если вы ожидаете большого переупорядочивания, я бы порекомендовал вам иметь запланированную задачу, чтобы время от времени «переупорядочивать» значения порядка для всей таблицы.

7
ответ дан 6 December 2019 в 09:17
поделиться

Добавьте столбец DATETIME с именем OrderDateTime. Используйте этот столбец (в порядке убывания) для устранения «связей» при упорядочивании и обновляйте его только при выполнении операции упорядочивания.

Например, в вашем примере предположим, что все строки имеют вчерашнее значение OrderDateTime.

Теперь, чтобы вставить элемент между 1 и 2, вы должны установить для него значение Order равным 2, а значение OrderDateTime равным now. Когда вы выбираете * FROM ProductList ORDER BY Order ASC, OrderDateTime DESC, новый элемент с номером 2 будет отсортирован перед существующим.

Точно так же, чтобы поменять местами элементы 4 и 5, вы должны обновить элемент 5, чтобы он имел порядок 4 и OrderDateTime сейчас. Он стал бы более свежим 4 предметом и появился бы раньше.

Вы должны быть внимательны, если вы попытаетесь вставить элемент между двумя другими элементами, которые уже имеют такое же значение Order, что вы разделите разницу значений OrderDateTime.

1
ответ дан 6 December 2019 в 09:17
поделиться

У вас есть два варианта:

  • Итерировать по строкам, используя оператор UPDATE с функцией / etc для генерации обновленного значения порядка.
  • Scorched Earth: вы удаляете существующие записи, и вставьте идентичные, сохраните исправленное значение порядка

. Нет никаких функций SQL, чтобы упростить это, и нет реального варианта, который был бы упрощен.

4
ответ дан 6 December 2019 в 09:17
поделиться

Вместо этого можно использовать связный список для упорядочивания (с каким-то особым способом определения головной части).

Вставки - это один INSERT и один UPDATE. Удаление - это один DELETE и один UPDATE. Перемещение - это три UPDATE. (Разумеется, используйте транзакции, чтобы не сломать связный список)

.
1
ответ дан 6 December 2019 в 09:17
поделиться

Вы можете использовать строку вместо числа с бесконечно большим количеством цифр. Если вы хотите вставить между "1" и "2", сделайте это "15".

3
ответ дан 6 December 2019 в 09:17
поделиться

Второй ответ на тот же вопрос:

Используйте поле DOUBLE для упорядочивания и разделения разницы между двумя значениями, между которыми вы хотите вставить. В любом стандартном бизнес-приложении я очень, очень сомневаюсь, что вы когда-нибудь приблизитесь к тому количеству вставок, при превышении которого вы не сможете устранить разницу в порядке сортировки.

4
ответ дан 6 December 2019 в 09:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: