Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как отсортировать определенные значения в одном столбце
 
 автор: Ringo   (30.07.2009 в 19:53)   письмо автору
 
 

Привет всем! Помогите решить проблему )
Пишу каталог на 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 ?
Прошу помогите пожалуйста.

  Ответить  
 
 автор: cheops   (31.07.2009 в 07:53)   письмо автору
 
   для: 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

Или имеется в виду сортировка с учетом двух полей?

  Ответить  
 
 автор: Ringo   (31.07.2009 в 08:59)   письмо автору
 
   для: 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 именно по этому отрезку, тут нужно как то еще остальные учитывать поля. тк они тоже необходимы. )
вот такая нелегкая задачка =)

  Ответить  
 
 автор: ride   (31.07.2009 в 11:33)   письмо автору
 
   для: Ringo   (31.07.2009 в 08:59)
 

если я правильно понял вопрос, сортируйте по двум полям и все:
order by field_id,value


upd
похоже я не правильно понял вас. рез-т сортировки будет такой:
field_id   price
      1         10
      1         15
      1         20
      2         30
      3         50

  Ответить  
 
 автор: Ringo   (31.07.2009 в 12:38)   письмо автору
 
   для: 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 в 13:46)   письмо автору
 
   для: 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 ?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования