Para una solución simple, tal vez subóptima-escalable, recomiendo la codificación dura de esto con el número máximo de niveles que tendrá:
Por sólo 2 niveles:
SELECT p2.name as `Parent name`, p1.*
FROM categories p1
LEFT JOIN categories p2 on p1.categories_id = p2.id
Eres realmente preguntar sobre la clasificación, así que recomiendo que genera un "camino" cadena -como: (ver más abajo para ejemplo del resultado de esta consulta)
SELECT Concat(If(isnull(p2.name),"",Concat("/",p2.name)),"/",p1.name) as `generated path`, p2.name as `Parent name`, p1.*
FROM categories p1
LEFT JOIN categories p2 on p1.parent_id = p2.id
order by `generated path`
para 3 niveles, TH ough sus datos no tiene esto todavía - ruta omite porque va a poner feo :)
SELECT p3.name as `Grandparent name`, p2.name as `Parent name`, p1.*
FROM categories p1
LEFT JOIN categories p2 on p1.categories_id = p2.id
LEFT JOIN categories p3 on p2.categories_id = p3.id
una solución más completa para seleccionar rápidamente todos los artículos en una categoría particular, a cualquier nivel, que requiere algo de trabajo en todo escribe, está implementando un 'right' and 'left' numbering concept. Pero, una discusión más profunda sobre eso está yendo más allá del alcance de lo que estás preguntando. Sin embargo, esa es la única buena manera en mi experiencia para hacer que este tipo de tabla de autorreferencia sea muy útil si va a ser grande (tal vez después de más de 1000 filas con 3 a 10 niveles).
Adición: ejemplo de salida de la segunda consulta:
generated path Parent name id name parent_id
----------------------------------------------------------------------------
/apple 1 apple 0
/apple/lisa apple 5 lisa 1
/apple/mac apple 2 mac 1
/atari 3 atari 0
/atari/st atari 4 st 3
@Fo - Parece ser un error tipográfico? Atari debe figurar en la lista justo después de la manzana – ajreal
No, los niños de manzana deben aparecer después de manzana, luego atari, y luego los niños de atari. (Lisa fue la computadora que Apple lanzó antes de Macintosh) –
¿Qué pasa con el nieto? Supongo que también deberían clasificarse (es decir, recursivamente)? – Tomalak