Здравствуйте, мне нужна ваша помощь с алгоритмом сортировки.
Есть таблица Products:
ID
name
Содержание:
ID Name
1 Продукт 12
2 Продукт 21
3 Продукт 66
4 Продукт 54
5 Продукт 75
...
32254 Продукт 21544
54577 Продукт 25012
продуктов в таблице может быть очень много.
Задача: нужно сделать сортировку продуктов. К примеру нужно продукту с ID 3 установить позицию после продукта с ID 32254, что бы потом в таком порядку вывести. Мне нужен оптимальный алгоритм для сервера и БД каким способом это можно реализовать.
Заранее спасибо.
Игорь_Vasinsky
7.04.2015 - 15:28
почитай про order by field
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
причем здесь Order By? У меня проблема не в выводе с БД. А как реализовать позиционирование продуктов в целом.
Игорь_Vasinsky
7.04.2015 - 15:47
Цитата |
нужно сделать сортировку продуктов |
Цитата |
К примеру нужно продукту с ID 3 установить позицию после продукта с ID 32254, |
Цитата |
каким способом это можно реализовать. |
Цитата |
почитай про order by field |
Цитата |
На форуме: 3 года, 10 месяцев, 12 дней |
в спячке чтоли был ?
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Сортировка на уровне SQL или PHP?
Если SQL - то order by
PHP -
тут
_____________
Принимаю заказы, писать в ЛС
Игорь_Vasinsky
7.04.2015 - 16:42
Медведь
если данные в БД - то и операции над ними нужно делать средствами БД
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Цитата (Игорь_Vasinsky @ 7.04.2015 - 16:42) |
Медведь если данные в БД - то и операции над ними нужно делать средствами БД |
Согласен
_____________
Принимаю заказы, писать в ЛС
S.Chushkin
7.04.2015 - 17:37
Не всё так просто, господа-товарищи.
Для решения задачи ("произвольный порядок") нужно добавить поле "Порядок". Вот тогда уже можно применять сортировку, что-то типа
order by порядок, name (или id, если надо)
_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Наверное я не доступно изложил суть задачи. Сейчас попробую детализировать:
Задача:
Организовать позиционирование продуктов, то есть - есть продукты которые нужно взять и упорядочить в том порядке в котором я захочу, и что бы потом его в таком порядке выводить.
Я могу в лоб сделать:
- добавить поле position в БД и у каждого продукта будет своя позиция
- но при каждом изменении позиции одного элемента я буду пересчитывать position для всех остальных
- можно не много оптимизировать этот метод и пересчитывать position зависимому диапазону продуктов то есть - нужно сменить position продукту с ID 1 после ID 3, вот берем этот диапазон и только в нем пересчитываем position.
- но все это не катит, потому что если будет тысячи продуктов то оно все загнется при огромном пересчете position.
Содержание:
ID Pos. Name
1 10 Продукт 12
2 20 Продукт 21
3 30 Продукт 66
4 40 Продукт 54
5 50 Продукт 75
...
Решение:
- может кто подскажет как сделать нормальное позиционирование продуктов, как реализовать правильно логику?
S.Chushkin
8.04.2015 - 12:59
Я же выше написал, нужно не "позиция", а "порядок". Это разные понятия.
В принципе, может быть предельный случай, когда порядок = позиция. Но на практике у меня никогда такого не было.
И да, придётся менять всю
зависимую нумерацию порядка. Это быстро и редко, поэтому не критично. Для "тысяч" это вообще будет мгновенно. Даже для "миллионов" достаточно быстро, чтобы не напрягаться. И повторюсь, менять нужно только "зависимые", - если критично, сделайте шаг 2(...3,4) и число перерасчётов резко уменьшится.
_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
AllesKlar
8.04.2015 - 13:30
nike90
Цитата |
- но все это не катит, потому что если будет тысячи продуктов то оно все загнется при огромном пересчете position. |
Это один запрос update к таблице на обновление одного поля. А при наличии индекса по этому полю (как и должно быть) эти тысячи записей обновятся очень быстро
UPDATE products SET position = position + iterator WHERE position > new_product_position
Если же ты хочешь физического перемещения записей в таблице, то ты на ложном пути. Работать с базой нужно на логическом уровне а физическую состовляющую оставь серверу базы.
_____________
[продано копирайтерам]
Цитата |
И да, придётся менять всю зависимую нумерацию порядка. Это быстро и редко, поэтому не критично. Для "тысяч" это вообще будет мгновенно. |
Представьте ситуацию когда человек сидит и сортирует продукты (перетягиванием) он это делает быстро, зависимый диапазон может быть в несколько тысяч а то и десятков тысяч продуктов, это каждый раз нужно делать update позиции тысячам продуктов .. это не так уж быстро у меня было, что на этом 503 вылетала timelimit, индексация поля есть, сервер заряженый норм.
Мне вообще этот подход с пересчетом позиции не нравится так как он очень ресурсоемкий, и логический не очень правильный (меняешь одному позицию, а пересчитывать нужно тысячам другим продуктам).
Я бы хотел узнать может есть какой то другой алгоритм позиционирования элементов?
Игорь_Vasinsky
8.04.2015 - 15:37
в первом посту - в примере 2 продукта. нужно понятней объяснять суть проблемы.
http://phpforum.su/index.php?showtopic=44241поиск по форуму:
конкурс на сортировку
_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
S.Chushkin
8.04.2015 - 16:10
Цитата (nike90 @ 8.04.2015 - 15:16) |
.. это не так уж быстро у меня было, что на этом 503 вылетала timelimit, индексация поля есть, сервер заряженый норм. |
mySQL даёт изменение порядка 30 тыс записей в сек.
Если у Вас меньше - ищите проблемы в настройках сервера.
_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Дело в том что если это один запрос который по условию изменит 30 тис. записей это быстрее чем, 30 тис. запросов через php на изменение каждой записи.
В данном случае у меня есть диапазон IDs которым нужно сделать:
UPDATE products SET position = position + iterator WHERE product_id = product_id
И это в php цикле 30 тыс. продуктов запросы на изменения позиции.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.