Utilisez les jointures.
Je supprimé certaines où les conditions pour plus de clarté
SELECT
c.id as c_id,
c.alias as c_alias,
c.title as c_title,
sc.id as sc_id,
sc.alias as sc_alias,
sc.title as sc_title,
a.alias as a_alias,
a.title as a_title,
sa.alias as sa_alias,
sa.title as sa_title
FROM
categories c
LEFT JOIN
articles a
ON
c.id = a.category_id
LEFT JOIN
categories sc
ON
c.id = sc.parent_id
LEFT JOIN
articles sa
ON
sc.id = sa.category_id
ORDER BY
c.rank,
a.rank,
sc.rank,
sa.rank
EDIT: Pour autant que je peux voir, ce n'est pas le cas ici, mais si vous voulez récupérer certains éléments de profondeur illimités, vous voudrez peut-être regarder a way to store strong hierarchical data in a relational database.
J'ai vérifié le lien mais en excluant les enfants à une autre fonction qui fait aussi une requête ne réduit pas les requêtes du tout ^^ – Henry
Il peut ou non, mais la requête donnée le fait. Dans votre cas, comme la profondeur est fixée à un sous-niveau seulement, le bénéfice est seulement de supprimer une jointure. Dans le cas où vous auriez besoin de récupérer une profondeur inconnue, cela pourrait vous aider si vous ne pouvez pas charger tous vos nœuds en même temps. –