|
|
|
| Здравствуйте. У меня такой вопрос. Не смог найти ничего , может кто подскажет.
Тип данных столбца - VARCHAR. Храняться всякие опции товаров, типа цвет,год, вообщем что угодно. Со словами все нормально, но вот если строка в начале содержит числа....
Например 60 cm, 90 cm,120 cm при сортировке ORDER BY ASC , выводяться в таком порядке:
120 cm
60 cm
90 cm
Что понятно не то. И понятно почему :/
Можно ли както правильно отсортировать посредством MySQL? | |
|
|
|
|
|
|
|
для: dim0s
(04.02.2008 в 00:37)
| | ну это же строка... сортировка идет по каждому символу, перебором...
по правилам
[знаки] < 0-9 < A-Z < a-z < А-Я < а-я
=) надо что вроду natsort() - из PHP)) | |
|
|
|
|
|
|
|
для: а-я
(04.02.2008 в 00:48)
| | Там в результате всего получется многомерный массив, его вроде natsort
не отсортировать. Хотелось бы решить все это в запросе, если это возможно, конечно. | |
|
|
|
|
|
|
|
для: dim0s
(04.02.2008 в 01:11)
| | Это неправильный подход.
Количественные данные внавал в тексте не хранят. Если, конечно, хотят работать с ними как с числами.
natsort() же - функция, являющаяся олицетворением этого неправильного подхода. | |
|
|
|
|
|
|
|
для: Trianon
(04.02.2008 в 09:19)
| | Ну может я неправильно описал. Данные текстовые, просто в них встречаются тексты, где первыми идут цифры.
Например:
Ширина
160 см (цена+ 150)
60 см (цена+ 100)
90 см (цена+ 120)
цена храниться отдельно и с ней потом работать. А список как то бы отсортировать. Можно или нет? Всмысле понятно, что все можно, если очень хочеться :), посредством SQL запроса - можно? | |
|
|
|
|
|
|
|
для: dim0s
(04.02.2008 в 14:39)
| | Создайте отдельное поля для ширины. А тип - числовой. | |
|
|
|
|
|
|
|
для: Unkind
(04.02.2008 в 14:44)
| | Ну это я Для примера ширину написал, там же может быть и не ширина.
Например:
Ширина
160 см (цена+ 150)
60 см (цена+ 100)
90 см (цена+ 120)
Цвет
Красный (цена+ 150)
Синий (цена+ 100)
Зеленый (цена+ 120)
Вообщем проблема в том, чтобы отсортировать по тестовому полю, где в тексте могут первыми стоять цифры(а могут и не стоять) | |
|
|
|
|
|
|
|
для: dim0s
(04.02.2008 в 15:38)
| | сортировка по текстовому полю осуществляется у Вас абсолютно корректно.
Перечитайте еще раз мой ответ. | |
|
|
|
|
|
|
|
для: Trianon
(04.02.2008 в 15:44)
| | Но ведь цены храняться в отдельном поле(не текстовом), просто отсортировать надо не по ним а по названиям. А названия, согласитесть, могут быть любым текстом, и таким как в примере.
Да по тестовому полю, все так и должно сортироваться, но ведь не по человечески. А как по человечески сделать? | |
|
|
|
|
|
|
|
для: dim0s
(04.02.2008 в 15:38)
| | > Ну это я Для примера ширину написал, там же может быть и не ширина.
А что же это поле значит? Ширина или цвет? В одну кучу всё не пихайте. | |
|
|
|
|
|
|
|
для: Unkind
(04.02.2008 в 16:00)
| | Давайте так, есть два поля:
первое - название(varchar)
второе -значение(decimal)
- все логично, нигде никакой кучи, не правда-ли?
Отсортировать надо по названию, так чтоб, даже если вназвании присутсвуют цифры выглядело по человечески. | |
|
|
|
|
|
|
|
для: dim0s
(04.02.2008 в 16:08)
| | > первое - название(varchar)
Название чего?
> второе -значение(decimal)
Откуда взялся decimal? Вы же сказали, что у Вас текстовый тип? | |
|
|
|
|
|
|
|
для: Unkind
(04.02.2008 в 16:21)
| | цена храниться отдельно и с ней потом работать
Да и не суть важно. Так оно и есть. Отсортироать надо один столбец впринципе.
Строковой.
типа:
красный
60см
синий
120 см
90 кг
зеленый
что-угодно
так чтоб получилось
60см
90 кг
120 см
зеленый
красный
синий
что-угодно
т.е сначала цифры, в порядке убывания, потом по алфавиту | |
|
|
|
|
|
|
|
для: dim0s
(04.02.2008 в 16:08)
| | >Давайте так, есть два поля:
>первое - название(varchar)
>второе -значение(decimal)
>
>- все логично, нигде никакой кучи, не правда-ли?
Конечно. Выполняется так:
ORDER BY `первое`,`второе` | |
|
|
|
|
|
|
|
для: Trianon
(04.02.2008 в 17:23)
| | Я так понял, что второе поле (цена) тут не при чем. Сортировка идет только по "куче". Собственно, смысла в этом нет абсолютно. | |
|
|
|
|
|
|
|
для: Unkind
(04.02.2008 в 17:25)
| | В 16:08 автор согласился на разумный компромисс. Я на него и ответил. :) | |
|
|
|
|
|
|
|
для: Unkind
(04.02.2008 в 17:25)
| | Всем спасибо.
Пришлось добавить еще одно поле(decimal_value), куда значение записываеться если строка состоит из цифр.
Потом
SELECT *
FROM
temp_table
ORDER BY decimal_value ASC, string_value
Сойдет более-менее | |
|
|
|
|
|
|
|
для: dim0s
(04.02.2008 в 17:35)
| | P.s.
Злые Вы :)
Куча вынужденная, так как это есть интернет магазин, где владелец может добавлять сам опции к товарам. Типа добавляет опцию "Размер", а потом к ней еще список значений :
название - доп. цена.
А размер, например он может прописать XXL или 56. Тобишь получиться
XXL - (+20)
или
56 - (+20)
А размеры должны идти попорядку вроде бы. Это опять же все отвлеченно - названия могут быть любыми.
Еще раз спасибо. Пока. | |
|
|
|