Tach!
Die erste Join-Anweisung sagt: "Zusätzlich zu der in der FROM-Anweisung stehenden Tabelle 'links' nimm jetzt auch noch die Tabelle 'categories' dazu.". In der SELECT-Anweisung steht, dass aus dieser Tabelle die Spalte 'name' verwendet werden soll. Und die ON-Anweisung des ersten JOINS sagt:"Nimm für 'name' jene Zeile, in der die ID der Zahl im 'category_id' Feld der Tabelle 'links' entspricht.
Die zweite Join-Anweisung sagt: "Zusätzlich zu der in der FROM-Anweisung stehenden Tabelle 'links' nimm jetzt für einen witeren Wert _nochmal_ die Tabelle 'categories' dazu.". In der SELECT-Anweisung steht, dass aus dieser Tabelle _wieder_ die Spalte 'name' verwendet werden soll. Und die ON-Anweisung des zweiten JOINS sagt:"Nimm für 'name' jene Zeile, in der die ID der Zahl im 'parent_id' Feld der Tabelle 'categories' entspricht.
Die Theorie geht etwas anders. (In der Praxis mag der Optimizer anders entscheiden, aber das ist egal.) Das SELECT steht zwar als erstes, wird jedoch erst später ausgewertet. Erst kommt FROM (mit JOINS), dann WHERE, dann GROUP BY, jetzt das SELECT eingeschoben, weiter mit HAVING, ORDER BY und LIMIT.
Nimm die Tabelle aus FROM, dazu nimm die JOINs *). Von diesen Mengen prüfe, was über die Join-Bedingung zusammenpasst. Diese eingeschränkte (wenn man kein kartesisches Produkt erzeugt hat) Menge filtere mit der WHERE-Bedingung. (GROUP BY lass ich weg.) Berechne nun die Angaben in der SELECT-Klausel für die bis jetzt entstandene Menge. (HAVING wieder ausgelassen.) Sortiere die Ergebnismenge und nimm dann nur noch die Menge gemäß LIMIT.
Im Klartext für deinen Fall: Nimm die Links, dazu die Kategorien. Verknüpfe alle Datensätze über l.category_id und c.id, wenn es entsprechende Datensätze gibt. Dann verknüpfe noch c1 über c.parent_id und c1.id mit der aus der ersten Verknüpfung entstandenen Menge. Die aktuelle Ergebnismenge hat nun für jeden Link-Datensatz einen verknüpften (oder weniger, wenn eine Kategorie oder Elternkategorie fehlen würde). Dann WHERE kommt und so weiter.
*) Implizite Joins machen keine Ausnahme (also die: FROM t1, t2 WHERE t1.x = t2.y).
dedlfix.