Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Problema con subconsulta

Estas en el tema de Problema con subconsulta en el foro de Bases de Datos General en Foros del Web. Hola, me gustaría que alguien me pudiera ayudar con esta cuestión. Quiero hacer una comparación entre dos tablas de la misma base utilizando dos select ...
  #1 (permalink)  
Antiguo 23/07/2006, 18:28
 
Fecha de Ingreso: enero-2002
Mensajes: 74
Antigüedad: 22 años, 4 meses
Puntos: 0
Problema con subconsulta

Hola, me gustaría que alguien me pudiera ayudar con esta cuestión.
Quiero hacer una comparación entre dos tablas de la misma base utilizando dos select anidados y que me saque los registros que existen en la base 2 que no están en la base 1. Las tablas son prácticamente iguales ya que tienen los mismos campos y mismas características y solo varían en que la tabla 2 tiene mas registros que la tabla 1. Con ello pretendo sacar solo lo que se haya actualizado o añadido en la segunda tabla respecto a la primera.
Utilizo esta consulta pero no me funciona ya que saca todos los registros y no solo los diferentes

Código PHP:
$Resultado=mysql_query("SELECT nombre,url FROM tabla2 WHERE url NOT IN ('SELECT url FROM tabla1')");
while(
$row=mysql_fetch_array($Resultado)){
$nombre=$row["nombre"];
$url=$row['url'];
print 
$nombre" ==== ".$url."<br>";

También agradecería si alguien me puede orientar para hacerlo de otra forma

Además me gustaría preguntar si alguien sabe por qué si el select anidado SELECT url FROM tabla1 no lo pongo entre comillas ' no funciona dando un error: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
En todas las consultas que he visto en la red va sin las comillas

Nota la versión de PHP instalada en mi servidor es la 4.4.1
  #2 (permalink)  
Antiguo 24/07/2006, 01:32
 
Fecha de Ingreso: junio-2006
Mensajes: 87
Antigüedad: 17 años, 10 meses
Puntos: 0
La consulta es sin las comillas, ya que puesiendo las comillas lo conviertes en un texto la consulta, y es con ese texto con la que lo comparas...

Las subconsultas estan soportadas en MySQL a partir de la versión 5.0, que version de MySQL tienes instalada?

En oracle se podria hacer de la siguiente forma (en MySQL todavia no lo he probado como es la sintaxis)

Código:
SELECT t2.nombre,t2.url FROM tabla1 t1,tabla2 t2
WHERE t2.url=t1.url(+)
and t1.url is null
  #3 (permalink)  
Antiguo 24/07/2006, 12:34
 
Fecha de Ingreso: enero-2002
Mensajes: 74
Antigüedad: 22 años, 4 meses
Puntos: 0
Hola Seanchan
Muchas gracias por tu respuesta.
Perdón, he confundido la versión de php con la versión de MySql. Según el phpinfo de mi servidor, la versión es: Client API version 4.1.20 y la de php la 4.4.1
Entiendo que a partir de la versión 4.1, MySql si admite subconsultas según se desprende de esta página http://sunsite.mff.cuni.cz/MIRRORS/f...b-selects.html pero no he sido capaz de hacerlo. Al final he solucionado el problema creando dos nuevas tablas con los campos que me interesaba comprobar si habían variado y contrastándolo entre las dos tablas.
El error que me daba era "Internal Server Error. The server encountered an internal error or misconfiguration and was unable to complete your request." en el script pòr lo que he limitado la consulta a 1000 registros y he de hacerla varias veces seguidas.

Código PHP:
//Creamos la tabla1 unicamente con los campos que nos interesa comprobar a partir de la tabla 
//antigua
$crear_tabla=mysql_query("CREATE TABLE `base`.`tabla1` (
`nombre` varchar( 177 ) NOT NULL default '',
`url` varchar( 255 ) NOT NULL default '',
KEY `nombre` ( `nombre` )
) TYPE = MYISAM"
,$idConexion0);
$cargar_tabla=mysql_query("INSERT INTO `base`.`tabla1` SELECT nombre,url FROM `base`.`tabla_antigua`",$idConexion0);

//Creamos la segunda tabla a partir de la tabla nueva con la que queremos comprobar las 
//actualizaciones
$crear_tabla=mysql_query("CREATE TABLE `base`.`tabla2` (
`nombre` varchar( 177 ) NOT NULL default '',
`url` varchar( 255 ) NOT NULL default '',
KEY `nombre` ( `nombre` )
) TYPE = MYISAM"
,$idConexion0);
$cargar_tabla2=mysql_query("INSERT INTO `base`.`tabla2` SELECT nombre,url FROM `base`.`tabla_nueva`",$idConexion0);


//buscamos en la tabla 2 los registros cuyo campo url sea igual en ambas tablas o sea que 
//exista también en la tabla 1 y procedemos a borrar en cada una de las tablas los que van 
//siendo comprobados. 
//La consulta está limitada a 1000 registros ya que si no 
//falla. 
//Este script hay que ejecutarlo varias veces en función del número de registros de las tablas
//hasta que no queden ya registros que comprobar (como se van borrando, cada vez comprueba registros diferentes 

$resultado=mysql_query("select url from tabla2",$idConexion0);
while((@
$row=mysql_fetch_array($resultado))&&($cantidad<='1000')){
$url=$row["url"];
mysql_query("delete from tabla2 where url='$url'");
mysql_query("delete from tabla1 where url='$url'");
$cantidad++;
}
//Una vez han sido comprobados todos los registros hacemos una consulta a la tabla2 una vez 
//depurada
$resultado=mysql_query("select * from tabla2",$idConexion0);
while(@
$row=mysql_fetch_array($resultado)){
$nombre=$row["nombre"];
$url=$row["url"];
print 
$nombre." - ".$url;


Ya se que es una chapuza sobre todo porque hay que ejecutarlo varias veces hasta comprobar todos los registros de la base. Si alguien tiene una mejor idea se lo agradecería mucho. Mi página está alojada en un servidor
y por tanto no puedo variar los parámetros. ¿Alguien sabe como evitar que falle el script por tiempo de ejecución?
Creo que el problema viene de que el script falla por falta de tiempo de ejecución en el servidor ya que si limito el número de registros a comprobar si funciona. Probablemente si limitara el número de registros en la subconsulta también funcionaría
Un saludo
  #4 (permalink)  
Antiguo 25/07/2006, 01:56
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años
Puntos: 0
Has probado con algo así

SELECT Tabla2.nombre, tabla2.url FROM tabla2 LEFT JOIN tabla1 ON Tabla2.url = Tabla1.url WHERE (Tabla1.url) is null

Un saludo
  #5 (permalink)  
Antiguo 25/07/2006, 04:49
 
Fecha de Ingreso: enero-2002
Mensajes: 74
Antigüedad: 22 años, 4 meses
Puntos: 0
Muchas gracias Teri. Si lo había probado pero incomprensiblemente no me daba el resultado que yo quería. He vuelto a rehacer la query que indicas y funciona correctamente por lo que toda la parafernalia que antes hacía aunque funciona es complicarse la vida inutilmente.

Un saludo y muchas gracias a todos
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 14:52.