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

segundo query no responde

Estas en el tema de segundo query no responde en el foro de Bases de Datos General en Foros del Web. Hola a todos Vengo luchando con esto desde hace dias y no le encuentro la vuelta. tengo una pagina php desde donde quiero relacionar dos ...
  #1 (permalink)  
Antiguo 30/11/2009, 08:40
Avatar de antena72  
Fecha de Ingreso: abril-2008
Mensajes: 15
Antigüedad: 16 años
Puntos: 0
Sonrisa segundo query no responde

Hola a todos

Vengo luchando con esto desde hace dias y no le encuentro la vuelta. tengo una pagina php desde donde quiero relacionar dos tablas de una misma base.

por separado funcionan perfecto pero cuando quiero hacer el query de la segunda tabla en la misma página, no tira los datos ni error.

Algún iluminado tiene idea del problema? yo soy principiante...

Código PHP:
include('datos.php');

//conecta con la base de datos
conectar();
    
$rs mysql_query("SELECT titulo, fecha, columnista, texto, imagen1, epigrafe, activo FROM blog_regata WHERE Id=$id");
    
    list(
$titulo$fecha$columnista$texto$imagen1$epigrafe$activo) = mysql_fetch_row($rs);
    
    
//traducir fecha para que la leaen castellano
    
$fecha_nueva explode"-"$fecha);
    
$fecha_castellano $fecha_nueva [2]."/".$fecha_nueva [1]."/".$fecha_nueva [0];
    
    
$texto stripslashes($texto); 
    
    
//tiro el nombre del columnista sin problemas
    
echo $columnista;
    
    
//busca los datos del columnista listado en el query anterior
    
$xs mysql_query("SELECT nombre, bio, mail, foto FROM blog_columnista WHERE nombre = '$columnista' ");
    
    list(
$nombre$bio$mail$foto) = mysql_fetch_row($xs);
    
    if (
mysql_errno()) {
        echo 
mysql_error();
        
desconectar();
        exit;
    }
    
    
desconectar(); 
gracias!!
  #2 (permalink)  
Antiguo 30/11/2009, 11:08
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: segundo query no responde

El columnista no tiene un codigo?
Has probado haciendo la consulta directamente en Analizador de Consultas?
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 30/11/2009, 12:50
Avatar de antena72  
Fecha de Ingreso: abril-2008
Mensajes: 15
Antigüedad: 16 años
Puntos: 0
Respuesta: segundo query no responde

Gracias por contestar flaviovich

No, el columnista no tiene codigo pero para asignarle el nombre y que no esté, por ejemplo escrito de otra manera, en el formulario de alta del texto se elige con un menu desplegable al columnista.

Es decir que antes de excribir alguna entrada, el columnista tiene que estar dado de alta. El campo que conecta ambas tablas es

Código PHP:
blog_regata.columnista blog_columnista.nombre 
no se qué es un Analizador de consultas, pero si sirve, por separado ambas tablas funcionan perfecto en el servidor remoto. Quise poner un link pero el foro no me deja hasta que no tenga mas intervenciones.

gracias
  #4 (permalink)  
Antiguo 30/11/2009, 14:50
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: segundo query no responde

Que motor de base de datos usas? En SQL Server se tiene el Analizador de consultas, donde puedes hacer pruebas de tus consultas.
Has hecho un debug a tu codigo php?
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #5 (permalink)  
Antiguo 30/11/2009, 16:28
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: segundo query no responde

Una cosa por lo que se refiere a la base de datos, la fecha en formato español puedes traértela desde la base con SELECT DATE_FORMAT(fecha, '%d-%m-%Y') fecha_castellano

Respecto a lo otro, debes pedir ayuda, como te sugiere flaviobich, en el foro PHP, porque el código no es el adecuado. Piensa que no puedes ver algo que no estás mostrando. Pide ayuda allí.
  #6 (permalink)  
Antiguo 01/12/2009, 06:00
Avatar de antena72  
Fecha de Ingreso: abril-2008
Mensajes: 15
Antigüedad: 16 años
Puntos: 0
Respuesta: segundo query no responde

Gracias a ambos

Puse mi pregunta en esta parte del foro porque tiene parte de PHP y parte query a una base SQL.

El código contiene dos querys que probados por separado andan a la perfección, el problema empieza cuando quiero hacer ambas consultas en una sola página.

La fecha se traduce sin problemas pero voy a probar lo que decís! El código en general no tira ningún error. Es decir que pasarlo por un analizador no solucionaria mi problema porque cada uno anda bien solo, pero ambos querys juntos no.

Estuve probando con un sólo query que involucre a ambas tablas pero no llegué a nada.

Pongo el código completo donde se pueden leer los resultados del primero query, pero el segundo no tira el resultado pero tampoco error.


Código:
<?
include('datos.php');

//conecta con la base de datos
conectar();
	$rs = mysql_query("SELECT titulo, fecha, columnista, texto, imagen1, epigrafe FROM blog_regata WHERE Id=$id");
	
	//SELECT titulo, fecha, columnista, texto, imagen1, epigrafe FROM Productos WHERE columnista = ANY
//(SELECT nombre, bio, mail, foto FROM blog_columnista WHERE nombre = columnista);

//SELECT titulo, fecha, columnista, texto, imagen1, epigrafe FROM blog_regata WHERE Id=$id
	
	list($titulo, $fecha, $columnista, $texto, $imagen1, $epigrafe) = mysql_fetch_row($rs);
	
	//traducir fecha para que la leaen castellano
	$fecha_nueva = explode( "-", $fecha);
    $fecha_castellano = $fecha_nueva [2]."/".$fecha_nueva [1]."/".$fecha_nueva [0];
	
	$texto = stripslashes($texto); 
	
	//busca los datos del columnista listado en el query anterior
	$xs = mysql_query("SELECT nombre, bio, mail, foto FROM blog_columnista WHERE nombre = '$columnista' ");
	
	list($nombre, $bio, $mail, $foto) = mysql_fetch_row($xs);
	
	if (mysql_errno()) {
		echo mysql_error();
		desconectar();
		exit;
	}
	
	desconectar();
?>

    <div id="regata">
    	<h1>Seguimos los pasos del Ice Lady II&nbsp;&nbsp;//&nbsp;&nbsp;<?= $fecha_castellano  ?></h1>
          
          <?      
			   if(!empty($imagen1)){
			   			echo "<img src='fotos/".$imagen1." ' />
						<h3>".$epigrafe."</h3>";
			};
    		?>
        
        <h2><?= $titulo ?></h2>
    	<h4>por&nbsp;<?= $columnista ?></h4>
        <p><?= nl2br($texto) ?> </p>
        
        <a href="entradas_public.php">Leer todas las cr&oacute;nicas</a>
        
    </div>  
 
 <?
		
echo "recupero el nombre del columnista por las dudas y sin problemas, pero el nuevo query parece no reconocerla:&nbsp;<br>" .$columnista;

echo $nombre.$bio.$mail.$foto;

echo "<div id='columnista'>";

	if (!empty($foto)){
	echo "<img src='fotos/columnistas/". $foto."' />";
	}
	
echo "<h2>nombre:&nbsp;". $nombre ."</h2>
<h2>bio:&nbsp;". $bio."</h2>
<h2>mail:&nbsp;". $mail ."</h2></div>";

?>

    
<br class="clearit" />
</div>


<br class="clearit" />
</div>
         
</body>
  #7 (permalink)  
Antiguo 01/12/2009, 06:41
Avatar de 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: segundo query no responde

Por lo que dices, una sentencia así debería funcionar para darte todo:
Código sql:
Ver original
  1. SELECT titulo, fecha, columnista, texto, imagen1, epigrafe, activo, nombre, bio, mail, foto
  2. FROM blog_regata BR INNER JOIN blog_columnista BC ON BR.columnista = BC.nombre
  3. WHERE BR.Id=$id
Si no devuelve nada es porque no hay ningún registro de la tabla blog_columnista que coincida con el contenido del campo blog_regata.columnista, o bien que ambos tienen alguna diferencia que hace que no se pueda concretar la relación (si es un string, con un caracter es suficiente y si hay diferencias de charset también).

Prueba tres cosas:
1. Qué es lo que realmente contiene la variable $columnista.
2. Qué es lo que realmente queda armado como segunda sentencia.
3. Qué pasa si usas el modelo de sentencia que te propongo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 01/12/2009, 07:27
Avatar de antena72  
Fecha de Ingreso: abril-2008
Mensajes: 15
Antigüedad: 16 años
Puntos: 0
Respuesta: segundo query no responde

gnzsoloyo sos un genio

Modifiqué un poco el código que me mandaste y funcionó perfecto. Transformé la columna que relaciona ambas tablas por un número. El problema era que al insertarse el nombre blog_columnista.nombre se insertaba también un espacio antes que no dejaba funcionar las cosas.

Pongo el código correcto y funcionando abajo.

Gracias a todos por la buena onda


Código PHP:
include('datos.php');

//conecta con la base de datos
conectar();
    
$rs mysql_query("SELECT  blog_regata.titulo,  blog_regata.fecha,  blog_regata.columnista,  blog_regata.texto,  blog_regata.imagen1,  blog_regata.epigrafe, blog_columnista.nombre, blog_columnista.bio, blog_columnista.mail, blog_columnista.foto
FROM blog_regata INNER JOIN blog_columnista 
WHERE blog_regata.Id=$id AND blog_regata.columnista = blog_columnista.id_c "
);
    
        
    list(
$titulo$fecha$columnista$texto$imagen1$epigrafe$nombre$bio$mail$foto) = mysql_fetch_row($rs);
    
    
//traducir fecha para que la leaen castellano
    
$fecha_nueva explode"-"$fecha);
    
$fecha_castellano $fecha_nueva [2]."/".$fecha_nueva [1]."/".$fecha_nueva [0];
    
    
$texto stripslashes($texto); 
    
    
//busca los datos del columnista listado en el query anterior
    //$xs = mysql_query("SELECT nombre, bio, mail, foto FROM blog_columnista WHERE nombre = '$columnista' ");
    
    //list($nombre, $bio, $mail, $foto) = mysql_fetch_row($xs);
    
    
if (mysql_errno()) {
        echo 
mysql_error();
        
desconectar();
        exit;
    }
    
    
desconectar(); 
  #9 (permalink)  
Antiguo 01/12/2009, 10:23
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: segundo query no responde

Te sugiero tener tu codigo asi:
Código sql:
Ver original
  1. SELECT BR.titulo, BR.fecha, BR.columnista, BR.texto, BR.imagen1, BR.epigrafe, BC.nombre, BC.bio, BC.mail, BC.foto
  2. FROM blog_regata BR
  3. INNER JOIN blog_columnista BC ON BR.columnista = BC.id_c
  4. WHERE BR.Id = $id
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #10 (permalink)  
Antiguo 02/12/2009, 08:49
Avatar de antena72  
Fecha de Ingreso: abril-2008
Mensajes: 15
Antigüedad: 16 años
Puntos: 0
Respuesta: segundo query no responde

Gracias flaviovich,

cambie mi opción por tu sugerencia y también anda perfecto. Hay alguna razón para hacer ese cambio?
  #11 (permalink)  
Antiguo 02/12/2009, 08:58
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: segundo query no responde

Claro que si. Al hacer el join, tienes que decirle a SQL explicitamente los campos, sino tendrá que buscarlos el mismo (en el where).
Si tienes una buena cantidad de registros, podrás darte cuenta de la diferencia en tiempo.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #12 (permalink)  
Antiguo 02/12/2009, 09:36
Avatar de 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: segundo query no responde

Cuando el o los campos de relación se especifican en el JOIN (INNER JOIN en este caso), el DBMS va realizando la selección en la medida que va leyendo las tablas, descartando lo que de entrada no cumple con la relación, y luego pasa a considerar lo que figura en el WHERE. En cambio, si la relación está establecida en el WHERE primero lee todos los registros de ambas tablas, para luego verificar el WHERE.
Esta segunda versión tiene dos problemas: Por un lado hace un producto cartesiano (M x N), con lo que la tabla en memoria puede ser inmensa; y por otro lado, lee muchísima información que finalmente no va a usar (datos basura), pero que ocupa espacio en el buffer.

Usar INNER JOIN ... ON ... es mucho más eficiente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 03/12/2009, 06:36
Avatar de antena72  
Fecha de Ingreso: abril-2008
Mensajes: 15
Antigüedad: 16 años
Puntos: 0
Respuesta: segundo query no responde

Muchas gracias a ambos por la explicación, tiene sentido! Por el momento la base es chica pero seguro después hace la diferencia.
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 12:06.