Перейти к содержанию
creatorua

Сортировка товаров 1 10 100

Рекомендуемые сообщения

Помогите с настройкой сортировки товаров. Сейчас товары сортируются по модели от Я до А получается  PL16  PL15  PL14............ Товары с наименованием модели PL102  PL101  PL100 сортируются не корректно получается порядок PL12  PL102  PL101  PL100  PL10  PL9 до 99 все нормально было пока не пошли товары с моделью номером выше 99.  

 

В базе данных в структуре у строки model стоит varchar символьное значение, может нужно какое другое установить или это в php коде правится? Не пойму как, что и где настроить на желаемое отображение.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты


SELECT *, CONVERT(SUBSTRING(model,2),UNSIGNED INTEGER) AS num

FROM product

ORDER BY num;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
SELECT *, CONVERT(SUBSTRING(model,2),UNSIGNED INTEGER) AS num
FROM product
ORDER BY num;

Данный запрос результата не дал

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на примере демо товаров

order by model

Товар 1
Товар 11
Товар 14
Товар 15
Товар 16
Товар 17
Товар 18
Товар 19
Товар 2
Товар 20

 

 

способ выше, хотя можно упростить CONVERT(model, UNSIGNED INTEGER)

Товар 1
Товар 2
Товар 3
Товар 4
Товар 5
Товар 6
Товар 7
Товар 8
Товар 9
Товар 11

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Столкнулся с той же проблемой, запрос , результат не дал к сожалению...версия 1.5.4.1  товарищ фрилансер, помогите советом

SELECT *, CONVERT(SUBSTRING(model,2),UNSIGNED INTEGER) AS num
FROM product
ORDER BY num;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня что-то тоже не работает этот способ. MySQL 5.5.34.

Ни `CAST()`, ни `CONVERT()`, ни `*1`. Ни с DECIMAL(10,2), ни UNSIGNED.

Ни с русскими, ни с латинскими названиями товаров.

Во всех случаях результат преобразований оказывается равен 0 (0.00).

Я поле `name` использовал, а не `model`, но это несущественно. Всякие COLLATE и CHARSET - обычные для опенкарт, на его базе пробовал запросы.

Пока не подсунешь функции преобразования что-то вроде `substring_index(name,' ',-1)`, т.е. строку, начинающуюся с цифр, кроме нуля в столбце с конвертированными названиями товаров только нули. В общем, любые символы перед цифрами -- мешают, а не отбрасываются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хотя можно упростить CONVERT(model, UNSIGNED INTEGER)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты


order by model+0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хотя можно упростить CONVERT(model, UNSIGNED INTEGER)

Повторю, не работает:

Ни `CAST()`, ни `CONVERT()`, ни `*1`. Ни с DECIMAL(10,2), ни UNSIGNED.

Я с этим около часа экспериментировал, наигрался по самые гланды. Итоговый вывод: буквы таки мешают. Хотя мне казалось, что всё кроме чисел должно попросту игнорироваться в результате этих преобразований. Но не игнорируется, а приводит к результату "0" и ничего не сортирует, разумеется.

 




order by model+0

Подозреваю. что "+0" ничем не лучше "*1" (см. выше), но ок, попробую на всякий случай. UPD: да, ничем не лучше.

post-10112-0-99534500-1399911088_thumb.pngpost-10112-0-83251500-1399911102_thumb.pngpost-10112-0-10682400-1399911115_thumb.pngpost-10112-0-46966200-1399911128_thumb.pngpost-10112-0-06886000-1399911143_thumb.pngpost-10112-0-21027700-1399911157_thumb.png

Изменено пользователем rb2
добавил картинок

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подозреваю. что "+0" ничем не лучше "*1" (см. выше), но ок, попробую на всякий случай.

Извиняюсь, не увидел. Но у меня, что *1, что +0 работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Версию MySQL писал (5.5.34, если не ошибаюсь). Остальное - обычная демо-база от опенкарт 1.5.6 (MyISAM, collation=utf8_general_ci), куда добавил товаров с русскими символами (товар 1, 2, 14).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И у @freelancer, похоже, работает. 

 

Еще раз посмотрел. У меня совпали для запроса идеальные условия сортировки. Выше указанное мной решение естественно не работает (((

 

Думаю в данной ситуации можно просто по извращаться с удалением символов, что бы оставить только цифры. Или, если известно кол-во цифр в окончании, то просто копирование его. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

try this

SELECT name, CONVERT(SUBSTRING_INDEX(name,' ',-1),UNSIGNED INTEGER) AS num
FROM oc_product_description
ORDER BY num desc

Wh3XVSw.png

 

я так понимаю, mysql при конвертации строки в число берет символы до первой не цифры

Изменено пользователем freelancer

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

try this

Э-э-э... Мои сообщения вообще видно? :)

Я же писал, что это единственное найденное решение. Но для реальной жизни непригодное, к сожалению, т.к. нет никакой гарантии, что искомые цифры будут в конце строки. Или что не будет буквенного префикса (как у топик-стартера, кстати говоря).

В итоге я вижу -- и у @ravilr, и у @freelancer всё точно так же, как у меня работает. В смысле не работает. У @ravilr просто набор тестовых данных неудачный, а у @freelancer в последнем сообщении топика видно, что "HP LP3065" стабильно транслируется в ноль, а значит написанное выше

на примере демо товаров

order by model

...

способ выше, хотя можно упростить CONVERT(model, UNSIGNED INTEGER)

Товар 1

...

Товар 9

Товар 10

просто-напросто не тестировалось на тех данных (Товар 1 - Товар 20), а было написано исходя из предположений о работе этой функии. Увы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ravilr сказал(а) 12 Май 2014 - 8:12 PM:

Думаю в данной ситуации можно просто по извращаться с удалением символов, что бы оставить только цифры. Или, если известно кол-во цифр в окончании, то просто копирование его.

Это да. Но это уже означает, что сортировку придётся выносить из MySQL и делать её средствами PHP. Та ещё радость. Боюсь, тут уже простого ответа на вопрос "как исправить сортировку в опенкарт", не получится - и дописать придётся немало, и продумать последствия изменений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

rb2, тогда regexp.

конечное решение зависит от набора данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это да. Но это уже означает, что сортировку придётся выносить из MySQL и делать её средствами PHP.

я имел ввиду строковые функции mysql

Если знаем кол-во цифр справа, то по ним и сортируем.

select * from oc_product order by right(model,2)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При convert и кучи товаров этот запрос будет очень тормозной, так как ему придется перебрать все товары.

Это скорее костыль для сайтов у которых мало товаров и мало посетителей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.