El problema es que estás haciendo un JOIN (la coma), cuando lo que deberías hacer es un LEFT JOIN, de modo que devuelva NULL donde no hay coincidencias.
No tengo la consulta completa, por lo que voy a simplificar el planteo.
Cuando usas la coma (para mi pésima costumbre), estás haciendo lo que se denomina
JOIN implícito. En ese caso MySQL realiza una junta natural entre las tablas devolviendo todo lo que coincide entre campos del mismo nombre de las diferentes tablas. Por eso requiere que, para evitar productos cartesianos, indiques qué campos se deben tomar en cuenta.
Pero en esencia la coma es un INNER JOIN. Sólo devuelve lo totalmente coincidente y no las excepciones. Para ese caso existen los LEFT JOIN y RIGHT JOIN, pero tienen una sitaxis algo diferente y a veces complicada de entender.
El caso sería más o menos así:
Código SQL:
Ver originalSELECT *
FROM publicaciones P
LEFT JOIN depcategorias D ON P.`idDepCategoria` = D.`idDepCategoria`
LEFT JOIN `subcategorias` S ON D.`idSubCategoria` = S.`idSubCategoria`
Como suelo comentar, en el SQL el orden de los factores
sí altera el producto, y este es un ejemplo.
LEFT JOIN devuelve todo lo que exista en la tabla a la izquierda del LEFT JOIN, tenga o no coincidencias con lo que está a la derecha; de la tabla derecha devuelve los registros válidos y el resto serán NULL.
Pero cuidado: El segundo LEFT JOIN sólo devolverá registros si y sólo si a) haces el LEFT JOIN contra la primera tabla, o b) la segunda tabla devuelve valores no nulos y sólo podrá hacerlo contra esos valores no nulos.
Esto significa que si
publicaciones devolviese 50 registros, y su LEFT JOIN contra
depcategorias devolviese 32 no nulos, el LEFT JOIN contra
subcategorías sólo usará esos 32 registros para hacer su tarea y pondrá NULL en el resto.
¿Se va entendiendo?
Esto sucede porque NULL no es un dato, sino un estado de indefinición (o puntero a la nada), y no puedes hacer operaciones de ningún tipo con las indefiniciones. Entonces simplemente las ignora.
Ten cuidado con las operaciones donde se presente un NULL. Si haces una suma directa contra un campo que contiene NULL, el resultado será siempre NULL.