2010-08-05 6 views
2

J'ai une table avec un ID comme clé primaire, et une description comme un autre champ.sélection triée à partir d'une seule table

Je veux d'abord sélectionner les enregistrements qui ont l'ID < = 4, triés par description, puis je veux tous les autres enregistrements (ID> 4), triés par description. Je ne peux pas y aller!

+2

Quel RDBMS utilisez-vous? – NullUserException

Répondre

1

Vous pouvez utiliser une expression id <= 4 dans votre ORDER BY clause:

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

cas de test (en utilisant 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'); 

Résultat:

+------+-------------+ 
| 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) 

poste connexe:

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

C'est très bien, même si elle retourne une colonne non-nécessaire (faible) – vulkanino

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

+1 J'aime ça, ma première pensée pour ce genre de choses est toujours UNION au lieu de penser à la solution slicker. – heisenberg

+0

Pourquoi ne pas simplement 'ORDER BY id <= 4 DESC, descr'? ... Les opérateurs de comparaison retournent déjà '0' ou' 1'. –

+0

@Daniel: Parce qu'au départ, OP n'a rien dit à propos de la base de données. Cette astuce peut être valide dans mysql (je crois que c'est une extension?), Mais, par exemple, dans MS SQL Server le résultat d'une comparaison est une valeur booléenne qui ne peut pas être utilisée de cette façon, donc un 'case' est un must. – GSerg

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

Vous pouvez utiliser 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 

OU

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

le premier ne fonctionne pas à cause du ORDER BY avant l'UNION (MySQl). le second est bien. – vulkanino

+0

Oups, mon mauvais .. Union version corrigée. – a1ex07

Questions connexes