2015-06-05 5 views
-1

Есть ли способ установить порядок по умолчанию, используемый MYSQL, в NULL в определенной записи.MYSQL order NULL между двумя конкретными записями

мой стол:

id  state 
1  downloading 
2  NULL 
3  error 
4  finish 
5  downloading 
6  NULL 
7  NULL 
8  fail 
9  finish 
10  error 

Я хочу быть NULL между «загрузки» и «ошибки» и не показывать «закончить», «провал». (после запроса в MYSQL) Я хочу привести быть похожим на это:

id  state 
1  downloading 
5  downloading 
2  NULL 
6  NULL 
7  NULL 
3  error 
10  error 

мой запрос: (не работает)

SELECT * FROM `report_table` 
WHERE 
    state NOT IN ('finish','fail') 
ORDER BY 
    case 
     when state= 'downloading' then 1 
     when state IS NULL then 2 
     when state= 'error' then 3 
     else 6 
    end, state ASC , id ASC 
LIMIT 1 
+0

Вы пробовали 'ORDER BY id ASC'? –

+0

@ Heru-Luin: Это не помогает. результаты уже упорядочены по ID ASC. – funforums

+0

Вы можете использовать mysql's ['FIELD (str, str1, str2, str3, ...)'] (http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_field) -> 'ORDER BY FIELD (\' state \ ', 'downloading', NULL, 'error', 'fail', 'finish')' – Sean

ответ

0

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

order by 
     case 
      when state= 'downloading' then 1 
      when state IS NULL then 2 
      when state= 'error' then 3 
      when state= 'fail' then 4 
      when state= 'finish' then 5 
      else 6 
     end 
+0

очень танковые танки ... –

+0

им с помощью этого: заказ по случай , когда состояние = «загрузка», затем 1 , когда состояние IS NULL, то 2 , когда состояние = «ошибки», то 3 , когда состояние = «сбой», то , когда состояние = ' финиш ', затем 5 еще 6 конец, состояние ASC, экономит DESC, попробуйте ASC это правда? –

0

Вы можете использовать CASE выражение в ORDER BY пункте:

SELECT id, state 
FROM mytable 
ORDER BY CASE WHEN state = 'downloading' THEN 'aa' 
       WHEN state IS NULL THEN 'ab' 
       ELSE state 
     END, id 

Таким образом 'downloading' записи будут первыми, а затем NULL записей, а затем остальные записи.

Demo here

+0

очень-очень танковые giorgos ... –

+0

не может ответить на этот вопрос :( –

+0

@ AdminFile3 В чем проблема? –

1

Обычно SQL позволяет вам заказывать любое выражение, которое вы хотите. Это не является необходимостью предоставлять только имена столбцов. Таким образом, вы можете создать выражение, которое будет заказывать ваши данные по вашему желанию. Предположим, мы выбрали магическое значение «dzzzzz», которое остается между «загрузкой» и «ошибкой». А потом просто напишите

ORDER BY COALESCE(state, "dzzzz"). 

Но будьте осторожны - MySQL на самом деле не эффективен в таких вещах.

+0

очень танки alexey –

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