2009-08-31 4 views
1

J'ai une table de catégorie avec id, nom, parentid.Instruction SQL à l'ordre des lignes par les enfants suivent chaque parent

id------name------parentid 
1  a   0 
2  b   0 
3  c   1 
4  d   1 
5  e   2 
6  f   2  
7  g   2 
8  h   2 
9  i   0 

Je veux une seule requête pour afficher le résultat dans le format suivant:

1---a 
3---c 
4---d 
2---b 
5---e 
6---f 
+1

Vous pouvez expliquer quel est le but de cette requête. Je le veux dans ce format .... –

+0

Ah, 'A' est le premier parent, suivi de ses enfants. 'B' est le deuxième parent suivi de ses enfants, 'I' est le troisième parent, il n'a pas d'enfants. –

+0

Actuellement, je veux afficher d'abord le parent puis ses enfants, puis encore un autre parent et son enfant – Santanu

Répondre

0

OK cela ne fonctionnera que si vous avez moins de 10.000 enfants par des parents, et ne fonctionnera que pour deux niveaux à savoir parent a un enfant, mais pas l'enfant a un enfant.

En outre, c'est SQL général, ne sais pas si ça va marcher pour mysql

select id, name from Category 
order by (parentid * 10000) + id 

Hope this helps

+0

Aah .. A obtenu la réponse Merci B.W. – Santanu

0

Peut-être que vous voulez paires uniques d'identification et le nom.

SELECT unique(id, name) FROM category; 
+0

Non, vous ne voulez pas cela. –

+0

Actuellement, je veux afficher d'abord le parent puis ses enfants, puis encore un autre parents et son enfant – Santanu

1

Vous aurez besoin d'écrire une fonction pour le faire.

CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value INT) RETURNS INT 
NOT DETERMINISTIC 
READS SQL DATA 
BEGIN 
     DECLARE _id INT; 
     DECLARE _parent INT; 
     DECLARE _next INT; 
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL; 

     SET _parent = @id; 
     SET _id = -1; 

     IF @id IS NULL THEN 
       RETURN NULL; 
     END IF; 

     LOOP 
       SELECT MIN(id) 
       INTO @id 
       FROM t_hierarchy 
       WHERE parent = _parent 
         AND id > _id; 
       IF @id IS NOT NULL OR _parent = @start_with THEN 
         SET @level = @level + 1; 
         RETURN @id; 
       END IF; 
       SET @level := @level - 1; 
       SELECT id, parent 
       INTO _id, _parent 
       FROM t_hierarchy 
       WHERE id = _parent; 
     END LOOP; 
END 

et de l'utiliser dans une requête:

SELECT CONCAT(REPEAT(' ', level - 1), CAST(hi.id AS CHAR)) AS treeitem, parent, level 
FROM (
     SELECT hierarchy_connect_by_parent_eq_prior_id(id) AS id, @level AS level 
     FROM (
       SELECT @start_with := 0, 
         @id := @start_with, 
         @level := 0 
       ) vars, t_hierarchy 
     WHERE @id IS NOT NULL 
     ) ho 
JOIN t_hierarchy hi 
ON  hi.id = ho.id 

Voir cette entrée il mon blog pour plus de détails sur la façon dont cela fonctionne:

Questions connexes