Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Obtener registros de una tabla siempre y cuando no exista en otra tabla

Estas en el tema de Obtener registros de una tabla siempre y cuando no exista en otra tabla en el foro de PHP en Foros del Web. Buenas tardes. Estoy trabajando con PHP y necesito ayuda con una consulta a la base de datos que estoy trabajando, explico de que se trata: ...
  #1 (permalink)  
Antiguo 13/08/2014, 11:06
Avatar de javier0730  
Fecha de Ingreso: enero-2010
Ubicación: Jalisco
Mensajes: 82
Antigüedad: 14 años, 10 meses
Puntos: 8
Obtener registros de una tabla siempre y cuando no exista en otra tabla

Buenas tardes.

Estoy trabajando con PHP y necesito ayuda con una consulta a la base de datos que estoy trabajando, explico de que se trata:

Tengo una base de datos en MySQL y tengo dos tablas una se llama Actividades y la otra DetalleActividad. La tabla Actividades sólo tiene calendarizado el mes en el que se llevará a cabo, la tabla DetalleActividad contiene todo los datos de lo hecho en la actividad. Ahora bien yo quiero saber que actividades se calendarizaron para Julio y que no se realizaron es decir que el registro existe en la tabla Actividad pero en la tabla DetalleActividad no existe, esos son los que quiero obtener para saber que actividades de ese mes no se realizaron.

Se que para hacer consultas que enlacen dos o mas tablas se utiliza el inner join y lo he hecho en varias ocasiones pero siempre con registros que existen en todas las tablas involucradas, pero ahora como quiero encontrar un registro que existe en una pero que no deba existir en la otra no se como hacerlo.

NOTA: en las dos tablas tengo un campo llamado ID_Actividad

Hasta el momento e intentado así:

Código PHP:
Ver original
  1. <?php
  2.         $c_act = mysql_query("SELECT * FROM Actividades inner join DetalleActividad on Actividades.id_actividad = DetalleActividad.id_actividad WHERE Actividades.id_actividad != NULL AND DetalleActividad.id_actividad = NULL ", $link);
  3.         $r_act = mysql_fetch_array($c_act);
  4.        
  5.         echo "Las actividades calendarizadas y no llevadas a cabo son las siguientes:";
  6.         do
  7.         {
  8.             echo $r_act["Actividades.id_actividad"]."<br />";
  9.         }
  10.         while ($r_act = mysql_fetch_array($c_act));
  11.         ?>


Espero su apoyo.
Gracias

Última edición por javier0730; 13/08/2014 a las 11:15
  #2 (permalink)  
Antiguo 13/08/2014, 11:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Obtener registros de una tabla siempre y cuando no exista en otra tabla

En MYSQL, el NULL no se usa con operadores lógicos porque no es un dato, es un estado. Por consecuencia no puede ser ni igual ni distinto a algo. Es NULL o no lo es, pero nada más.
Por otro lado INNER JOIN requiere que obligatoriamente haya registros que se puedan relacionar, para devolver algo. En tu query estás buscando lo que no coincide, cosas que INNER JOIN no devolverá jamás. En su lugar debes usar LEFT o RIGHT JOIN.
Además, te conviene usar alias para evitarte complicar las consultas.

Código MySQL:
Ver original
  1. SELECT A.*
  2. FROM Actividades A LEFT JOIN DetalleActividad DA ON A.id_actividad = DA.id_actividad
  3. WHERE DA.id_actividad IS 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)
  #3 (permalink)  
Antiguo 13/08/2014, 11:45
Avatar de javier0730  
Fecha de Ingreso: enero-2010
Ubicación: Jalisco
Mensajes: 82
Antigüedad: 14 años, 10 meses
Puntos: 8
Respuesta: Obtener registros de una tabla siempre y cuando no exista en otra tabla

Perfecto, es justo lo que necesitaba, sólo le agregue que lo ordene ascendentemente por ID de actividad y otra condición para obtener sólo las actividades que requerían presupuesto ya que se les asignaba un recurso desde la calendarización:

Código PHP:
Ver original
  1. $c_act = mysql_query("SELECT A.* FROM Actividades A LEFT JOIN DetalleActividad DA ON A.id_actividad = DA.id_actividad WHERE A.presupuesto = 'SI' AND DA.id_actividad IS NULL ORDER BY A.id_actividad ASC", $link);
  2. $r_act = mysql_fetch_array($c_act);

Con esto queda solucionado
Muchas gracias por la rápida respuesta

Etiquetas: mysql, registro, registros, select, siempre, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:35.