Ok, je vois ce que tu veux faire. Mais en une seule requête, c'est assez mal barré. Je me suis livré a de petits tests et ma conclusion (D'autres auront peut-être des suggestions meilleures) est qu'il manque une colonne dans ta table. Cette colonne pose un petit problème au départ : il faut connaitre l'identifiant (clé primaire) de la ligne parente racine. Sur la base du petit jeu d'essai, pour la première, ce sera 1, pour la seconde, 2, pour la troisième 1, pour la quatrième 2 et pour la cinquième 1.
Avec un jeu d'essai un peu grossi, ça donnerait quelque chose comme ceci :
mysql> CREATE TABLE `categorie` (
-> `cid` INTEGER UNSIGNED auto_increment PRIMARY KEY,
-> `rcid` INTEGER UNSIGNED NOT NULL default '1',
-> `pcid` INTEGER UNSIGNED NOT NULL default '0',
-> `name` varchar (32) NOT NULL default ''
-> );
Query OK, 0 rows affected (0.05 sec)
mysql>
mysql> INSERT INTO `categorie` (`cid`, `rcid`, `pcid`, `name`) VALUES
-> (1, 1, 0, 'test1'),
-> (2, 1, 1, 'test2'),
-> (3, 1, 2, 'test3'),
-> (4, 4, 0, 'test4'),
-> (5, 5, 0, 'test5'),
-> (6, 6, 0, 'test6'),
-> (7, 4, 4, 'test7'),
-> (8, 5, 5, 'test8'),
-> (9, 4, 7, 'test9'),
-> (10, 6, 6, 'test10'),
-> (11, 5, 8, 'test11'),
-> (12, 5, 11, 'test12'),
-> (13, 6, 10, 'test13'),
-> (14, 14, 0, 'test14');
Query OK, 14 rows affected (0.02 sec)
Records: 14 Duplicates: 0 Warnings: 0
mysql>
mysql> SELECT * FROM categorie;
+-----+------+------+--------+
| cid | rcid | pcid | name |
+-----+------+------+--------+
| 1 | 1 | 0 | test1 |
| 2 | 1 | 1 | test2 |
| 3 | 1 | 2 | test3 |
| 4 | 4 | 0 | test4 |
| 5 | 5 | 0 | test5 |
| 6 | 6 | 0 | test6 |
| 7 | 4 | 4 | test7 |
| 8 | 5 | 5 | test8 |
| 9 | 4 | 7 | test9 |
| 10 | 6 | 6 | test10 |
| 11 | 5 | 8 | test11 |
| 12 | 5 | 11 | test12 |
| 13 | 6 | 10 | test13 |
| 14 | 14 | 0 | test14 |
+-----+------+------+--------+
14 rows in set (0.00 sec)
mysql>
mysql> SELECT c1.cid, c1.pcid, c1.name
-> FROM categorie c1
-> ORDER BY c1.rcid, c1.cid, c1.pcid;
+-----+------+--------+
| cid | pcid | name |
+-----+------+--------+
| 1 | 0 | test1 |
| 2 | 1 | test2 |
| 3 | 2 | test3 |
| 4 | 0 | test4 |
| 7 | 4 | test7 |
| 9 | 7 | test9 |
| 5 | 0 | test5 |
| 8 | 5 | test8 |
| 11 | 8 | test11 |
| 12 | 11 | test12 |
| 6 | 0 | test6 |
| 10 | 6 | test10 |
| 13 | 10 | test13 |
| 14 | 0 | test14 |
+-----+------+--------+
14 rows in set (0.00 sec)
Si tu regardes la requête de création, j'ai bien "cid" pour la clé primaire, pcid pour la clé parente, mais en plus rcid pour la clé racine qui doit correspondre à la clé primaire de la racine et donc ne peut pas être à 0 mais au minimum 1.
Voilà, je sais pas si cette solution te convient, je n'en vois pas d'autre simple sans passer par des procédures stockées : il n'est peut-être pas nécessaire de sortir l'artillerie lourde à ce stade....
______________________________________________________________
Une question bien formulée, c'est un problème bien compris : ça représente déjà les 3/4 de la réponse ;)