Ver Mensaje Individual
  #11 (permalink)  
Antiguo 04/01/2012, 03:52
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema de lógica en base de datos MySQL

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 original
  1. SELECT *
  2. FROM publicaciones P
  3.     LEFT JOIN depcategorias D ON P.`idDepCategoria` = D.`idDepCategoria`
  4.      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.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)