Я работаю над тем, где пользователи могут переупорядочить элементы, и в дальнейшем эти элементы должны отображаться в выбранном порядке. В качестве простого примера рассмотрим список элементов:
A, B, C, D, E, F, G.
Таблица MySQL была бы простой: user_id, letter, sortnumber
Пользователю разрешено изменять порядок поэтапно. Они могут перемещать A до D, G в начало и т. Д. Кроме того, они могут добавлять и удалять элементы. Таким образом, они могут удалить C или добавить X. На каждом из этих шагов я отправляю данные на PHP, который будет обрабатывать его, и задавать элементы в MySQL.
Есть два пути, которые я вижу в этом:
Так что мне просто любопытно … кто-то должен был иметь дело с чем-то, что имеет порядок, и если да, то как вы это сделали?
Добавьте столбец «Последовательность» в таблицу – как число с плавающей запятой.
Когда элемент перемещается между Row-A и Row-B, его порядковый номер присваивается среднему числу этих соседних столбцов
Индекс столбца Последовательность:
Когда пользователь хочет сохранить новый порядок элементов, сравните новый порядок со старым заказом и произведите обновление только тех, у кого есть их sortnumber . Если они удаляют элемент, вам не нужно смещать смену sortnumber . Если вы отсортируете список с номером, отсутствующим в середине, он все равно будет в правильном порядке.
Окончательный порядок последовательности – это единственный вопрос. Если вы переместите шесть предметов вокруг, чтобы получить конкретный заказ, вам действительно не нужно заботиться о том, какая последовательность списка находится в точках между тем, как это было, когда вы начали, и каково это, когда вы закончите.
Добавьте и удалите элементы, не беспокоясь о порядке последовательности, а затем обновите элементы, чтобы установить значение последовательности, когда вы нажимаете кнопку с надписью «Сохранить сортировку».
Это дает вам два преимущества:
Вот тот же ответ, который я дал вопросу Томашафа:
Это непростая задача. Если у вас есть небольшое количество сортируемых элементов, я бы просто сбросил все их в новый порядок.
В противном случае, похоже, потребуется столько же работы, сколько «тест-и-установка», чтобы изменить только те записи, которые были изменены.
Вы можете делегировать эту работу на стороне клиента. Попросите клиента сохранить порядок старого порядка и порядок сортировки и определить, какая строка [порядок сортировки] должна быть обновлена, а затем передает эти кортежи в интерфейс PHP-mySQL.
Вы можете улучшить этот метод следующим образом ( не требует поплавков):
Если все отсортированные элементы в списке инициализируются порядком сортировки в соответствии с их позицией в списке, задайте для сортировки каждого элемента что-то вроде строки [sort-order] = row [sort-order * K], где K это некоторое число> среднее число раз, когда вы ожидаете, что список будет переупорядочен. O (N), N = количество элементов, но увеличивает пропускную способность по крайней мере на N * K с по меньшей мере K открытыми слотами между каждой выходящей парой элементов.
Затем, если вы хотите вставить элемент между двумя другими, это так же просто, как изменить его порядок сортировки, чтобы быть тем, что есть> нижний элемент и <верхний. Если между элементами нет «комнаты», вы можете просто повторно применить алгоритм «распространения» (1), представленный в предыдущем абзаце. Чем больше K, тем реже будет применяться.
Алгоритм K будет выборочно применяться в скрипте PHP, а выбор нового порядка сортировки будет выполняться клиентом (возможно, Javascript).
Имейте первичный ключ и sortnumber для каждого элемента. Если у вас есть 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++; }
Просто добавьте еще один столбец. Позвоните по 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
.