ГлавнаяРегистрацияВходВ закладки

Главная » Статьи » PHP, MySQL » MySQL
Автоматическая сортировка строк с вспомогательным порядковым столбцом средствами MySQL
Автор: admin  Раздел: 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.
Об быстроты выполнения при таком варианте беспокоиться не доводится, но тем не менее она очень пристойная.
Просмотров: 2667
Дата: 2011-09-03 23:40:51
Комментариев: 0
Источник: