Php, выбор MySQL - PullRequest
       31

Php, выбор MySQL

0 голосов
/ 11 мая 2010

У меня есть эта таблица ATTRIBUTE

id     name       um
12    capacity  MB;GB;TB

А это таблица2:

id    id_attribute  id_product    name       value     um
 1        12         40        hdd maxtor     30       GB
 2        12         41        hdd maxtor     40       GB
 3        12         42        hdd y           1       TB

Как выбрать таблицу 2 в следующем порядке: 30 ГБ, 40 ГБ, 1 ТБ?

Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 11 мая 2010
select value, um 
from tbl

order by 

case um 
when 'KB' then 1
when 'MB' then 2
when 'GB' then 3
when 'TB' then 4
else 5
end,

value

Но если вы хотите учесть, что 1200 ГБ> 1 ТБ и должны быть отсортированы в последнюю очередь, сделайте следующее:

select value, um 
from tbl

order by value *

case um 
when 'KB' then 1000
when 'MB' then 1000000
when 'GB' then 1000000000
when 'TB' then 1000000000000
else 1000000000000000
end

[EDIT]

Использование таблицы Джеффа Бека:

select tbl.value, tbl.um 
from tbl
join unit /* name Jeff's table as unit */
on unit.um = tbl.um

order by 
    unit.type -- this will nicely "group" the related type
    ,tbl.value * unit.magnitude
2 голосов
/ 11 мая 2010

Вы также захотите, чтобы это работало и с MB, поэтому я бы создал функцию для преобразования значения двух столбцов и единой системы обмена сообщениями в результат mb. Таким образом, функция умножит значение на 1 для МБ и 1000 для ГБ и 1000000 для ТБ. Затем вы можете заказать на функцию. Но это не будет идеальным исполнением, но с этим мета-стилем я не знаю точно, как еще его оптимизировать.

Чтобы расширить это, вы можете создать таблицу перевода для всех ваших UM, над которыми работала функция, чтобы она могла поддерживать это для других вещей, а не только для размера.

Итак, в качестве примера добавьте таблицу типа

|Type  |UM |Magnitude|
______________________
|Size  |GB |1000     |
|Size  |MB |1        |
|Size  |TB |1000000  |
|Weight|g  |1        |
|Weight|kg |1000     |

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

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

2 голосов
/ 11 мая 2010

«ВЫБРАТЬ * ИЗ ТАБЛИЦЫ 2 ЗАКАЗАТЬ ПО ГМ ASC, значение ASC» Что это делает: сначала заказы по UM, затем заказы по стоимости. Это работает только потому, что [случайно] ГБ является строкой «меньше», чем ТБ. Я предлагаю переключать их с числовыми значениями, потому что МБ меньше, чем ГБ, но строка не.

Сделайте еще одну таблицу с этими полями: um_id, um_name, um_order, затем замените UM на um_id.

С уважением, Gabriel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...