2012-01-19 1 views
1

У меня есть таблица с увеличенным идентификатором от 1,2,3 ... и так далее. Я хочу только сортировать данные в порядке убывания на основе поля «id», кроме первых двух строк. Я попытался с помощью ниже запроса: -сортировать определенные строки, используя случай заказа mysql

SELECT * FROM categories ORDER BY CASE WHEN id<3 THEN 0 ELSE id END DESC 

Это дает мне результат, как

id name 
5  Meal 
4  Apparel 
3  Electronics 
1  Sports 
2  Lifestyle 

Но выход должен прийти как

id name 
1  Sports 
2  Lifestyle 
5  Meal 
4  Apparel 
3  Electronics 

Есть ли какой-либо способ добиться этого с помощью такого запроса ?

+0

это может быть немного больше advantageuos, чтобы добавить/столбец веса заказа, а затем вы можете просто использовать это, чтобы заказать записи –

+0

Нет, я не могу добавить какой-либо другой столбец для указания порядка или веса. Мне нужно получить его во время работы. – neeraj

ответ

2

Попробуйте это :

SELECT * 
FROM categories 
ORDER BY CASE WHEN id < 3 THEN 10000 - id ELSE id END DESC; 
-- ----------------------------^ 
-- use a very large number 

Edit:

Лучшее решение, которое не требует жесткого кодирования 10000:

SELECT * 
FROM categories 
ORDER BY CASE WHEN id < 3 THEN id ELSE 3 END, id DESC 
-- ---------------------^   ^
-- ------------------------------------| 
-- these numbers must be same 
+0

Как насчет этого? SELECT * FROM items ORDER BY CASE WHEN id = 1 THEN 0 WHEN id = 2 THEN 1 ELSE 2 END, id DESC; – neeraj

+0

Я получил выше запрос, работающий в любом случае, есть ли миллионы строк. Идея состоит в том, что нам нужно назначить временный номер конкретному идентификатору, который не требуется сортировать ... Поэтому, в конце концов, если есть первые 5 строк, не нужно сортировать, тогда запрос будет выглядеть как SELECT * FROM категорий ORDER BY CASE WHEN id = 1 ТОГДА 0 КОГДА id = 2 THEN 1 WHEN id = 3 THEN 2 WHEN id = 4 THEN 3 WHEN id = 5 THEN 4 WHEN id = 6 THEN 5 ELSE 999 END, id DESC; – neeraj

+0

См. Исправленный ответ. –

1

Это потому, что вы заказываете по убыванию идентификаторов, поэтому заказ составляет 5-4-3-0-0. Вы можете попробовать:

SELECT * FROM categories ORDER BY CASE WHEN id<3 THEN 9999 ELSE id END DESC 

Но это не идеальное решение

+0

Первый вариант работает. Но почему вы думаете, что это не идеальное решение? BTW я не люблю использовать союз – neeraj

+0

О, я вижу, что он не работает для больших данных. Значит, если я изменяю условие от <3 до <10 в большой таблице. – neeraj

+0

Если в вашем результате есть два или более '9999', MySQL может сортировать эти строки любым способом. Измените его на 'CASE WHEN id <3 THEN 10000 - id ELSE id END', чтобы быть уверенным. –

2

Изменить его:

CASE WHEN id<3 THEN id ELSE ~id END 

И вместо случае используйте IF:

IF(id<3, id, ~id) 
+0

Оба решения не работают – neeraj

+0

@neeraj Извините, у вас была опечатка. Предположим, что '~' вместо '-'. – Ariel

+0

Это гораздо лучшее решение, и в этом случае нам не нужно беспокоиться о количестве строк таблицы. Спасибо за ваш ответ – neeraj