Se chiedi "C'è nelle query ricorsive mysql?" rispondi "NO".
Ma c'è un ottimo approccio per gestirlo.
Crea una tabella di supporto (dicendo CatHierarchy)
CatHierarchy:
SuperId, ChildId, Distance
------------------------------
1 1 0
1 2 1
2 2 0
Questi dati ridondanti consentono facilmente in 1 query di selezionare qualsiasi gerarchia e in 2 inserti supportano qualsiasi gerarchia (l'eliminazione viene eseguita anche in 1 query con l'aiuto dell'eliminazione dell'integrità a cascata).
Che cosa significa questo. Tieni traccia di tutti i percorsi nella gerarchia. Ogni nodo di Cat deve aggiungere un riferimento a se stesso (distanza 0), quindi supportare la duplicazione aggiungendo dati ridondanti sui nodi collegati.
Per selezionare la categoria con sub basta scrivere:
SELECT c.* from Category c inner join CatHierarchy ch ON ch.ChildId=c.cat_id
WHERE ch.SuperId = :someSpecifiedRootOfCat
someSpecifiedRootOfCat - è il parametro per specificare la radice di categoryTHATS ALL!