Автоматическая сортировка строк с вспомогательным порядковым столбцом средствами MySQL
На так давно довелось осуществить махинацию с БД какая, как представляется как может показаться, асбсолютно невозможна средствами MySQL. Вблизи около меня была матрица продуктов, сортировка каких исполняется добавочным столбцом `order_num` ('последовательный номер'): она дает возможность высокомерничать прирученную сортировку продуктов.
Однако вот понадобилось автоматом уписать данный столбец так, дабы продукты очутились отсортированы по наименованию: т. е., с вблизи ограничений, видоизменить столбец `order_num` в всей таблице. Весьма желалось встать средствами MySQL в отсутствие привлечения каких-нибудь добавочных приборов, и задачка была решена Сложность задачки вдобавок в этом MySQL не может сделать UPDATE таблицы и в одно время декламировать из ее: в MyISAM таблица эксклюзивно объединяется при записи и недостает способности изготовить чтение в подзапросе. , , , * This source code was highlighted with . Сначало товары отсортированы дьявол знает как. Необходимо просортировать их в складе по `model`: то есть чтобы столбец сортировки `order_num` товаров повышался синхронно сортировке по `model`. Движок данного магазина глюкает если у многих товаров `order_num` совпадает. Классифицировать товары по `model` при выводе невозможно: утеряется вероятность сортировки вручную. В столбце сортировки `order_num` обязаны торчать именно эти id товаров `product_id`, однако в верном распорядке. Так мы точно исключим дублирования значений сортировки, а «ORDER BY `order_num`» выведет продукты, отсортированные по `model` — то есть верно Видну, что в собственном случае велась сортировка товаров одной группы, по этой причине невозможно употреблять последовательные 0,1,2,… — для применения подходится лишь id продукта. Значит так, стоит задача распределения массива id товаров по столбцу `order_num`. Сначала необходимо досоздать преходящею таблицу `by_model`, в какую поместим `product_id` товаров, отсортированных по `model`. Кроме всего этого, нужно приплюсовать очередной столбец: отметчик строчек. Итог станет глядеть, пример, так: Сие практически неоригинально. Нужно только добавить столбец `rowid` с номерами строчек: `rowid`, `product_id` * This source code was highlighted with . Подобно формируется ещё одна преходящая таблица `by_prod`: перечень абсолютно всех `product_id`, отсортированный по возрастанию. Точно так же подливается столбец-счётчик: `rowid`, `product_id` * This source code was highlighted with . `product_id`, `ord` * This source code was highlighted with . Делается явно, что если товарам с id'шниками из первоначального столбика таблицы `products-sort` прикарманить последовательный номер из 2-го столбика, то мишень будет достигнута * This source code was highlighted with . Заместо творения 3 преходящих таблиц можно обойтись одной только `products-sort`, а прочие расположить как приложенный запрос внутрь конструкции WHERE. И тут как будет глядеть это все, организованное в гуляю: @n_row := 0, @n_ord := 0; # Творение преходящей таблицы, сохраняющей отражение новоиспеченного последовательного гостиница `ord` на изменяемый продукт `product_id`. Это отображение употребляется при обновлении главной таблицы. `product_id`, `ord` # Добавочная матрица: счётчик + id товаров, отсортированные по `model` `rowid`, `product_id` # Вспомогательная таблица: счётчик + id товаров, отсортированные по id `rowid`, `product_id` * This source code was highlighted with . Только 3 запроса, и незапятнанный MySQL. Об быстроты выполнения при таком варианте беспокоиться не доводится, но тем не менее она очень пристойная. |