|
|
|
| Привет всем! Помогите решить проблему )
Пишу каталог на PHP. Организация таблицы:
http://softtime.ru/forum/read.php?id_forum=3&id_theme=48491
Появилась необходимость сортировать по дополнительным полям. (ORDER BY) по возрастанию убыванию. Тока вот не пойму как это сделать?
Например есть дополнительные поле field_name = price его field_id = 22
в таблицу field_values в столбик value добавляются значения. например 300 )
Так вот, как в этой таблице field_values отсортировать значения values по возрастанию или убыванию где field_id = 22 ?
Прошу помогите пожалуйста. | |
|
|
|
|
|
|
|
для: Ringo
(30.07.2009 в 19:53)
| | По возрастанию цены строки можно отсортировать при помощи запроса
SELECT * FROM field_values
WHERE field_id = 22
ORDER BY price
|
по убыванию
SELECT * FROM field_values
WHERE field_id = 22
ORDER BY price DESC
|
Или имеется в виду сортировка с учетом двух полей? | |
|
|
|
|
|
|
|
для: cheops
(31.07.2009 в 07:53)
| | С учетом двух полей. Структура таблиц у меня такая что каждое поле хранится в качестве значения а не столбца. Вот тут полное описание таблиц:
http://softtime.ru/forum/read.php?id_forum=3&id_theme=48491
вот такие получаются таблицы с добавлением price = цена:.
fields:
+----+--------+---------+
| id | cat_id | name |
+----+--------+---------+
| 1 | 14 | модель |
| 2 | 14 | частота |
| 3 | 15 | модель |
| 4 | 15 | слот |
| 22 | 15,14 | цена |
+----+--------+---------+
products:
+----+--------+----------+
| id | cat_id | title |
+----+--------+----------+
| 1 | 14 | core2duo |
| 2 | 15 | geforce |
| 3 | 15 | zyxel |
+----+--------+----------+
field_values:
+----+------------+----------+---------+
| id | product_id | field_id | value |
+----+------------+----------+---------+
| 1 | 1 | 1 | 6400 |
| 2 | 1 | 2 | 2000mhz |
| 3 | 2 | 3 | 8800gtx |
| 4 | 2 | 22 | 350 |
| 5 | 1 | 22 | 550 |
| 6 | 3 | 22 | 50 |
| 7 | 3 | 3 | P-660RU |
+----+------------+----------+---------+
|
Вот нужно как то отсортировать поле value где field_id = 22 именно по этому отрезку, тут нужно как то еще остальные учитывать поля. тк они тоже необходимы. )
вот такая нелегкая задачка =) | |
|
|
|
|
|
|
|
для: Ringo
(31.07.2009 в 08:59)
| | если я правильно понял вопрос, сортируйте по двум полям и все:
upd
похоже я не правильно понял вас. рез-т сортировки будет такой:
field_id price
1 10
1 15
1 20
2 30
3 50
|
| |
|
|
|
|
|
|
|
для: Ringo
(31.07.2009 в 08:59)
| | В общем придумал одно решение, но сортировка опять дала сбой почему то =(
Запросом выбираю все product_id где field_id = 22 и сортирую их сразу же по value
SELECT
products.id, products.title,
fvalue.field_id, fvalue.value
FROM
products
LEFT JOIN field_values fvalue ON (products.id = fvalue.product_id AND fvalue.field_id = 22)
WHERE
product.cat_id = 15
ORDER BY
fvalue.value ASC
LIMIT
0,9 ;
|
И потом на основе этих ID решил подключать к ним дополнительные поля.
Где в запросе будет, примерно так:
SELECT
....
WHERE
fvalue.products_id IN (СПИСОК Всех ID выбранных в предыдущем запросе) AND fields.id = fvalue.field_id
ORDER BY
FIELD(fvalue.products_id, СПИСОК Всех ID выбранных в предыдущем запросе.) ASC
|
Но вот первый запрос у меня почему то глючит, он не правильно сортирует. В моих значениях цены были такие :
1000 2000 3000 250
так вот он сортировал как 1000 2000 250 3000
MYSQL считала что 250 не больше 3000 и не меньше 250 как будто нолик добавляла (((
Из за чего это может быть? поле value создано как varchar. Или запрос косячный но я четко указываю же что сортировать по fvalue.value ASC. Он и сортирует, если указан DESC то получается тоже самое тока в обратном порядке. 250 в середине =( | |
|
|
|
|
|
|
|
для: Ringo
(31.07.2009 в 12:38)
| | Я сообразил =) он поле fvalue.value воспринимает как текстовое, так оно и есть. Сделал такой запрос :
SELECT
products.id, products.title,
fvalue.field_id, fvalue.value + 0 as ordervalue
FROM
products
LEFT JOIN field_values fvalue ON (products.id = fvalue.product_id AND fvalue.field_id = 22)
WHERE
product.cat_id = 15
ORDER BY
ordervalue ASC
LIMIT
0,9 ;
|
То есть конструкцией fvalue.value + 0 as ordervalue я преобразовал в цифровой формат.
После запрос вывел правильный результат. И сортировка прошла успешно.
Так вот у меня вопрос возможно ли как то что бы MYSQL на ходу вычислял если данные в цифровом формате то он и преобразовывал бы в цифровое поле, без конструкции
fvalue.value + 0 as ordervalue ? | |
|
|
|