Cela devrait vous donner ce que vous voulez
EDIT Il n'a pas .... voir la dernière édition ci-dessous:
select
parent.id, parent.title, count(child.id) 'number of children'
from
ttt parent left join ttt child
on child.parent = parent.id
group by parent.id
order by parent.id;
sortie de MySQL:
+----+-------+--------------------+
| id | title | number of children |
+----+-------+--------------------+
| 1 | abc | 2 |
| 2 | xyz | 1 |
| 3 | pqr | 0 |
| 4 | uuu | 0 |
+----+-------+--------------------+
EDIT : Au moins en MySQL, le ORDER BY
est superfluous:
Si vous utilisez GROUP BY, les lignes de sortie sont triées en fonction des colonnes GROUP BY comme si vous aviez un ORDER BY pour les mêmes colonnes. Pour éviter le tri supplémentaire que GROUP BY produit, ajoutez ORDER BY NULL
Merci pour le conseil, thomasrutter!
EDIT: Eh bien, thaggie a souligné que je souffre d'un cas de ne pas lire attentivement la question ici. La réponse ci-dessus obtient seulement les enfants d'un parent, pas tous les descendants. Comme d'autres l'ont souligné, si vous utilisez Oracle, vous pouvez utiliser leur syntaxe STARTS WTIH/CONNECT BY. Sinon, this article peut être intéressant.
On dirait que cela a été une demande d'amélioration depuis un certain temps pour mysql – Tom