2010-08-05 3 views
2

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

Я хочу сначала выбрать записи, имеющие идентификатор < = 4, отсортированные по описанию, затем я хочу, чтобы все остальные записи (id> 4) отсортированы по описанию. Не могу добраться!

+2

Какие СУБД вы используете? – NullUserException

ответ

1

Вы можете использовать id <= 4 выражение в вашем ORDER BY пункте:

SELECT * FROM your_table ORDER BY id <= 4 DESC, description; 

тест случае (с использованием MySQL):

CREATE TABLE your_table (id int, description varchar(50)); 

INSERT INTO your_table VALUES (1, 'c'); 
INSERT INTO your_table VALUES (2, 'a'); 
INSERT INTO your_table VALUES (3, 'z'); 
INSERT INTO your_table VALUES (4, 'b'); 
INSERT INTO your_table VALUES (5, 'g'); 
INSERT INTO your_table VALUES (6, 'o'); 
INSERT INTO your_table VALUES (7, 'c'); 
INSERT INTO your_table VALUES (8, 'p'); 

Результат:

+------+-------------+ 
| id | description | 
+------+-------------+ 
| 2 | a   | 
| 4 | b   | 
| 1 | c   | 
| 3 | z   | 
| 7 | c   | 
| 5 | g   | 
| 6 | o   | 
| 8 | p   | 
+------+-------------+ 
8 rows in set (0.00 sec) 

Похожие темы:

2
select *, id<=4 as low from table order by low, description 
+0

Это нормально, даже если он возвращает не нужный столбец (низкий) – vulkanino

4
select id, descr 
from t 
order by 
case when id <= 4 then 0 else 1 end, 
descr 
+0

+1 Мне это нравится, моя первая мысль о таких вещах всегда является UNION вместо того, чтобы думать о решении slicker. – heisenberg

+0

Почему не просто 'ORDER BY id <= 4 DESC, descr'? ... Операторы сравнения уже возвращают '0' или' 1'. –

+0

@ Даниэль: Потому что изначально ОП ничего не говорил о базе данных. Этот трюк может быть действительным в mysql (я считаю, что это расширение?), Но, например, в MS SQL Server результатом сравнения является логическое значение, которое нельзя использовать таким образом, поэтому «случай» является обязательным. – GSerg

1
select id, description 
from MyTable 
order by case when id <= 4 then 0 else 1 end, description 
1

Вы можете использовать UNION

SELECT * FROM (SELECT * FROM table1 WHERE id <=4 ORDER by description)aaa 
UNION 
SELECT * FROM (SELECT * FROM table1 WHERE id >4 ORDER by description)bbb 

ИЛИ

SELECT * FROM table1 
ORDER BY 
CASE WHEN id <=4 THEN 0 
ELSE 1 
END, description 
+0

первый из них не работает из-за ORDER BY перед UNION (MySQl). второй - это хорошо. – vulkanino

+0

Упс, мой плохой. Версия союза исправлена. – a1ex07

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