Веб-приложение на базе MySQL: самый простой способ для пользователей выбрать заказ или товары? - PullRequest
4 голосов
/ 13 февраля 2009

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

A, B, C, D, E, F, G.
Таблица MySQL будет простой: user_id, letter, sortnumber

Пользователь может изменять порядок в пошаговых шагах. Они могут перемещать A на D после D, G на начало и т. Д. Кроме того, они могут добавлять и удалять элементы. Поэтому они могут удалить C или добавить X. На каждом из этих шагов я отправляю данные в PHP, который будет их обрабатывать, и устанавливаю элементы в MySQL.

Есть два пути, которые я вижу в этом:

  1. Каждый раз, когда они добавляют / удаляют / переупорядочивают отправьте весь список PHP, удалите все данные, которые они предыдущий был там, и просто вставить новый список. Проблема в том, это много удаления / вставки каждый раз, когда они Делать что-нибудь. Они могут переместить A после B, а затем я неожиданно удаляю 7 записей и вставляю еще 7. С положительной стороны, это очень просто.

  2. Каждое «движение», которое они делают (например, добавление, удаление или переупорядочение), отправляют информацию для этого. Например. они переместили An после F и сказали мне «переместить An после F». Теперь я должен проверить, что в списке есть и A, и F, а затем уменьшить значение «sortnumber» между A и F (включая F). Если они говорят «удалить Z», я должен найти его в списке, удалить его и уменьшить после него все номера сортировки записей.

Так что мне просто любопытно ... Кто-нибудь имел дело с чем-то, где важен порядок, и если да, то как ты это сделал?

Ответы [ 6 ]

2 голосов
/ 13 февраля 2009

Добавить столбец последовательности в таблицу - как число с плавающей запятой.

Когда элемент перемещается между Строкой-A и Строкой-B, установите его порядковый номер на Среднее из этих соседних столбцов

Индексируйте столбец последовательности:)

0 голосов
/ 22 февраля 2009

Просто добавьте еще один столбец. Назовите это order.

У вас есть порядок строк, и у каждой строки есть идентификатор или первичный ключ. Просто проходите по строкам по одному и устанавливайте порядок на ходу. Итак:

UPDATE item_table SET order = 0 WHERE id="fred";
UPDATE item_table SET order = 1 WHERE id="larry";
UPDATE item_table SET order = 2 WHERE id="john";
UPDATE item_table SET order = 3 WHERE id="sydney";

Я уверен, что есть математические способы сделать это математически, но иногда простые ответы лучше.

Затем, когда вы делаете запрос, добавьте SORT BY order.

0 голосов
/ 22 февраля 2009

Вот тот же ответ, который я дал на вопрос Томасафа:

Это не простая проблема. если ты имеют низкое количество сортируемых элементы, я бы просто сбросил все их на новый порядок.

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

Вы можете поручить эту работу сторона клиента. Пусть клиент поддерживает старый порядок сортировки и новый порядок сортировки и определить, какой ряд [порядок сортировки] ' должен быть обновлен - затем проходит те кортежи к интерфейсу PHP-mySQL.

Вы можете улучшить этот метод в следующим образом ( не требуется поплавки):

  1. Если все сортируемые элементы в списке инициализированы в порядке сортировки в соответствии с их положением в список, установите порядок сортировки каждого элемент к чему-то вроде строка [порядок сортировки] = строка [порядок сортировки * K] где K - это некоторое число> среднее сколько раз вы ожидаете, что список быть переупорядочен. O (N), N = количество элементы, но увеличивает вставку емкость по крайней мере, N * K, по крайней мере, K открытых слотов между каждой выходящей парой элементов.

  2. Тогда, если вы хотите вставить элемент между двумя другими, его как просто, как изменить порядок сортировки на быть тем, что является> нижним элементом и <верхний Если нет "комнаты" между элементами вы можете просто повторно применить алгоритм «распространения» (1) представлен в предыдущем абзаце. Чем больше К, тем реже будет применяться. </p>

Алгоритм K будет выборочно применяется в сценарии PHP в то время как выбор нового порядка сортировки быть сделано клиентом (Javascript, возможно).

0 голосов
/ 15 февраля 2009

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

// base array
$items = array( 7, 11, 9, 4, 5);
// remove item 11
array_splice($items, array_search(11), 1);
// insert 11 before item 4
array_splice($items, array_search(4), 0, 11);
// input now contains 7, 9, 11, 4, 5

Затем перебрать массив и обновить сортировку первичными ключами

$i = 0;
foreach($items as $item) {
  // UPDATE item_table SET sorting = '$i' WHERE id = '$item';
  i++;
}
0 голосов
/ 14 февраля 2009

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

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

Это дает вам два преимущества:

  • Это намного меньше накладных расходов при каждой смене элемента, что также означает, что это будет быстрее.
  • Установить последовательность очень просто - все, что вам нужно сделать, это отправить список идентификаторов элементов в нужном порядке, а затем выполнить итерацию по нему, обновляя значение последовательности, начиная с 0 и увеличивая.
0 голосов
/ 13 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...