Tengo una tabla en mi base de datos que almacena una estructura de árbol. Estos son los campos pertinentes:Buscar nodos de hoja en árbol jerárquico
mytree (id, parentid, otherfields...)
Quiero encontrar todos los nodos hoja (es decir, cualquier registro cuyo id
no es de otro registro parentid
)
He intentado esto:
SELECT * FROM mytree WHERE `id` NOT IN (SELECT DISTINCT `parentid` FROM `mytree`)
Pero eso devolvió un conjunto vacío. Extrañamente, eliminar el "NO" devuelve el conjunto de todos los nodos de hoja.
¿Alguien puede ver dónde me está yendo mal?
Actualización: Gracias por las respuestas, todos han sido correctos y funcionó para mí. Acepté el de Daniel porque también explica por qué mi consulta no funcionó (lo NULO).
Realmente es mucho mejor usar la sintaxis de unión sugerida en lugar de una subconsulta. – Draemon
En realidad, no. Cualquier RDBMS a mitad de camino optimizará uno en el otro según sea necesario. La mejor práctica es usar cualquier forma que exprese tu intención más claramente. En este caso, esa forma es casi incuestionablemente una subconsulta. –