2010-07-09 4 views
2

C'est ma table:Comment commander des lignes SQL pour créer un joli rollup?

CREATE TABLE t (id INT, parent INT, FOREIGN KEY(parent) REFERENCES t(id)); 

Ceci est une collection de données dont je dispose:

id parent 
1  NULL 
2  NULL 
3  1 
4  1 

Je voudrais les sélectionner et l'ordre comme celui-ci:

id parent 
1  NULL 
3  1 
4  1 
2  NULL 

je peux Ne trouvez pas une bonne façon de le faire (en MySQL 5+). S'il vous plaît, aidez, merci!

+2

'ORDER BY RAND()'? : P Quelle est la règle de votre résultat? – hsz

+0

Je pense qu'il veut parent-> enfants-> parent-> enfants. – Kendrick

+0

S'il vous plaît modifier votre message et ajouter plus de détails concernant l'ordre prévu des lignes récupérées. – Anax

Répondre

3

S'il n'y a que les enfants et les parents, et pas petits-enfants, vous pouvez utiliser:

select id 
,  parent 
from yourtable 
order by 
     coalesce(parent, id) 
+0

En quoi cela diffère-t-il de "order by parent, id"? Je n'ai jamais utilisé de coalesce avant ... – Kendrick

+0

+1 me battre. –

+0

colaesce (a, b) est l'équivalent de (si a est nul alors b a a) –

0

Je crois que cela devrait faire l'affaire

SELECT id, parent FROM t ORDER BY IF(parent is NOT NULL,parent,id) 
1

Pas possible dans une requête simple, vous devez commander par colonne de 1 à la fois. Je ne l'ai pas essayé avec MySQL. Il est possible que si vous avez joint une requête ordonnée avec une autre requête ordonnée, vous puissiez faire quelque chose, mais je doute que vous puissiez garantir l'ordre à travers les versions DB ou les différents ensembles de données.

Il est probable que l'option la plus simple serait de traiter le problème dans un ordre spécifique dans la base de données et de l'afficher dans l'ordre souhaité via votre code frontal.

+0

Je suis d'accord avec @Kendrick, et je peux aussi ajouter que toute solution possible ne fonctionnera que si la commande des parents et des enfants est séquentielle. Et si vous avez un parent qui a une carte d'identité plus grande que celle des enfants, cela peut devenir compliqué! –

1
SELECT * FROM REFERENCES ORDER BY id=2, parent , id 

OU JUSTE

SELECT * FROM REFERENCES ORDER BY id=2 , id