2010-12-01 6 views
2

J'ai une table étudiants avec des noms et des hauteurs. Je veux une requête qui ordonne aux élèves plus haut que 150cm par ordre alphabétique et les élèves plus petits que 150cm dans l'ordre décroissant de leurs noms.sql union ordre

Quelque chose comme ceci:

(select * from students where height >= 150 order by name) 
union 
(select * from students where height < 150 order by name desc) 

cela ne fonctionne pas parce gâchis syndical jusqu'à l'ordre des lignes dans les sous-requêtes. Je sais que c'est normal, la production d'un ensemble est un jeu et dans un ensemble l'ordre n'est pas important. Y a-t-il quelque chose comme append?

+1

Quelle dbms utilisez-vous? – Davita

+0

dbms est mysql 5.1 – bistro1992

+0

L'exemple de requête est valide sur MySQL. Si cela ne fonctionne pas, fournissez plus de détails - comme le numéro d'erreur et le message si vous en obtenez un. –

Répondre

1
select *, case when height >= 150 then 1 else 0 end as tallstudent 
from students order by tallstudent, name 
+1

+1, très proche et sur la bonne voie, mais il ne sera pas ordonner les étudiants courts descendant –

+0

ah, bon appel. n'a pas assez lu la question – kenwarner

+1

merci. ça marche. – bistro1992

8
SELECT * 
    FROM students 
    ORDER BY IF(height >= 150, 1,0) DESC, 
      IF(height >= 150, name, '') ASC, 
      name DESC 

échantillon sortie

+------+--------+ 
| name | height | 
+------+--------+ 
| a | 189 | 
| m | 666 | 
| thy | 166 | 
| yyy | 1277 | 
| zz | 101 | 
| swq | 122 | 
| n | 111 | 
| g | 145 | 
+------+--------+