2013-08-22 2 views
1

Я получил простую таблицу:Mysql порядок И.Ф. условия - неправильный порядок

CREATE TABLE `dev_a4a`.`test` ( `id` INT UNSIGNED NOT NULL 
AUTO_INCREMENT , `type` VARCHAR(45) NOT NULL , `priority` INT NOT 
NULL , PRIMARY KEY (`id`)); 

со следующими строками:

id|type |priority 
1 |long |8 
2 |long |3 
3 |short|9 
4 |short|1 

Я хочу, чтобы получить строки упорядоченные по условию:

SELECT (RAND() * priority) as prio, type, priority FROM test 
ORDER BY (IF(type = 'short', '2', prio)) DESC, id DESC 

В результате я получил строки, не упорядоченные по условию. Каждый раз, когда он выглядит случайным. Вот один из возможных результатов:

prio     | type | priority 
'0.05013570194145264', 'long', '8' 
'2.9015473750434326', 'long', '3' 
'0.320064320527077', 'short', '1' 
'7.598900996706356', 'short', '9' 

Что я делаю неправильно?

Ожидаемый результат:

prio     | type | priority 
'2.9015473750434326', 'long', '3' <- order by prio 
'7.598900996706356', 'short', '9' <- order by common value 2 
'0.320064320527077', 'short', '1' <- order by common value 2 
'0.05013570194145264', 'long', '8' <- order by prio 
+0

Обеспечить набор результатов, которые должны быть в вашем образце. –

ответ

0

Ok я решил этот вопрос:

SELECT CASE WHEN type = 'short' THEN 2 ELSE RAND() * priority END AS prio, type, priority FROM test ORDER BY prio DESC, id DESC 
0

Что об этом

SELECT (RAND() * priority) as prio, type, priority ,CASE `type` 
     WHEN 'short' THEN 2 
     WHEN 'long' THEN 1 

    END AS t 
FROM test 
ORDER BY 3 DESC, id DESC 
+0

dont use ORDER BY 3 - это склонность к ошибкам при изменении позиций столбца ... просто используйте ORDER BY priority –

+0

В вашем примере строки всегда упорядочиваются по столбцу «priority». Я хочу дать «короткие» типы общее случайное значение и рассчитать случайное значение для каждого «длинного» типа на основе его приоритета, а затем упорядочить по этим значениям. –

Смежные вопросы