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

ayuda por favorrrrrrrrr

Estas en el tema de ayuda por favorrrrrrrrr en el foro de Bases de Datos General en Foros del Web. Hola, tengo un problemón q no logro resolverlo dispongo de una tabla referencias donde se almacenan titulo, año, lugar etc.., de unos articulos también dispongo ...
  #1 (permalink)  
Antiguo 16/12/2004, 05:04
 
Fecha de Ingreso: junio-2004
Mensajes: 101
Antigüedad: 19 años, 10 meses
Puntos: 0
ayuda por favorrrrrrrrr

Hola, tengo un problemón q no logro resolverlo
dispongo de una tabla referencias donde se almacenan titulo, año, lugar etc.., de unos articulos
también dispongo de 6 subtablas enlazadas mediante claves ajenas a la tabla referencias. En estas tablas se guardan datos mas especificos de cada tabla

Dispongo de un buscador, en el que puedes elegir que tipo de articulo quieres buscar. Aqui esta el problema, si elijo un tipo de articulo que conozco como libro, conferencia, etc, los resultados se me muestran correctamente, porque tan solo es enlazar con la tabla correspondiente y unir las claves ajenas de esa tabla y la principal.

Pero si no conozco el tipo de articulo, no se como mostrar los resultados, ya que he intentado todo lo que se puede hacer y mas y no funciona
lo que he probado es:
select * from referencia r, book b, conferencia c, etc.., así con todas las tablas
luego en la clausula where
pongo
where r.id_referencia=b.id_referencia or b.id_referencia=c.id_referencia...
asi con las demas tablas
esto lo hago para poder extraer los datos especificos de cada tabla.
Ademas a la clausula where, despues de esto, le añado
and r.author like '$author' .....
y asi con los demas campos que tiene el buscador


de que otra manera podria enlazar las claves ajenas para que me muestre los resultados correctamente. asi lo que hace es que me muestra todos los registros de mi tabla, pero no funciona correctamente.

Alguien sabe como podria hacer esto, si es que hay manera de hacerlo?
  #2 (permalink)  
Antiguo 16/12/2004, 05:46
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años
Puntos: 0
Prueba a hacerlo con LEFT JOIN

SELECT r.*, b.*,c.* ....
FROM ((referencia r LEFT JOIN book b
ON r.id_referencia = b.id_referencia) LEFT JOIN conferencia c on r.id_referencia = c.id_referencia) ...
WHERE r.author like '$author' ...


Un saludo
  #3 (permalink)  
Antiguo 16/12/2004, 06:27
 
Fecha de Ingreso: junio-2004
Mensajes: 101
Antigüedad: 19 años, 10 meses
Puntos: 0
gracias por tu respuesta

lo he intentado tb, pero no lo he conseguido, te pongo el codigo que he puesto

case 'unknown':
$_pagi_sql="select r.*, b.*,j.*,c.*,t.*,th.*,m.* ((from referencia r left join book b)";
$_pagi_sql.="left join book b on r.Id_Reference=b.Id_Rerence ";
$_pagi_sql.="left join journal j on r.Id_Reference=j.Id_Reference ";
$_pagi_sql.="left join conferencia c on r.Id_Reference=c.Id_Reference ";
$_pagi_sql.="left join thecnical_report t on r.Id_Reference=t.Id_Reference ";
$_pagi_sql.="left join thesis th on r.Id_Reference=th.Id_Reference ";
$_pagi_sql.="left join miscellaneous m on r.Id_Reference=m.Id_Reference) ";
$_pagi_sql.="where ";

if (!empty($title)) $_pagi_sql.= "r.Title like '%".$title."%'";

if (!empty($author)) $_pagi_sql.= "AND r.Author like '%".$author."%'";

if (!empty($year)) $_pagi_sql.="AND r.Year like '%".$year."%'";

if ($month!="no")
{
switch($month)
{
case "january": $_pagi_sql.= "AND r.Month like '%january%'";break;
case "february": $_pagi_sql.= "AND r.Month like '%february%'";break;
case "march": $_pagi_sql.= "AND r.Month like '%march%'";break;
case "april": $_pagi_sql.= "AND r.Month like '%april%'";break;
case "maig": $_pagi_sql.= "AND r.Month like '%maig%'";break;
case "june": $_pagi_sql.= "AND r.Month like '%june%'";break;
case "july": $_pagi_sql.= "AND r.Month like '%july%'";break;
case "august": $_pagi_sql.= "AND r.Month like '%august%'";break;
case "september": $_pagi_sql.= "AND r.Month like '%september%'";break;
case "october": $_pagi_sql.= "AND r.Month like '%october%'";break;
case "november": $_pagi_sql.= "AND r.Month like '%november%'";break;
case "december": $_pagi_sql.= "AND r.Month like '%december%'";break;
}
}

break;
esto todo forma parte de un switch. He probao hacer la consulta de varias formas pero, supongo que no la estoy haciendo bien, o tendre algun error.

gracias
  #4 (permalink)  
Antiguo 16/12/2004, 06:35
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años
Puntos: 0
Pon tantos paréntesis como tablas necesites, así te aseguras que vaya haciendo las cosas en su orden

$_pagi_sql="select r.*, b.*,j.*,c.*,t.*,th.*,m.* (((((((from referencia r left join book b)";
$_pagi_sql.="left join book b on r.Id_Reference=b.Id_Rerence) ";
$_pagi_sql.="left join journal j on r.Id_Reference=j.Id_Reference) ";
$_pagi_sql.="left join conferencia c on r.Id_Reference=c.Id_Reference) ";
$_pagi_sql.="left join thecnical_report t on r.Id_Reference=t.Id_Reference) ";
$_pagi_sql.="left join thesis th on r.Id_Reference=th.Id_Reference) ";
$_pagi_sql.="left join miscellaneous m on r.Id_Reference=m.Id_Reference) ";
$_pagi_sql.="where ";

y además comprueba que la parte del WHERE no te esté haciendo sacar los resultados
  #5 (permalink)  
Antiguo 16/12/2004, 09:09
 
Fecha de Ingreso: junio-2004
Mensajes: 101
Antigüedad: 19 años, 10 meses
Puntos: 0
sigue sin funcionar

no funciona así tampoco, no me muestra ningún resultado...
  #6 (permalink)  
Antiguo 16/12/2004, 10:18
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años
Puntos: 0
Y no te da error de sintaxis??? has una cosa, antes de lanzar la SQL al servidor, escribe el valor de $_pagi_sql, comprueba que SELECT estás montando y vamos viendo
  #7 (permalink)  
Antiguo 17/12/2004, 03:05
 
Fecha de Ingreso: junio-2004
Mensajes: 101
Antigüedad: 19 años, 10 meses
Puntos: 0
aqui te pongo el valor de _pagi_sql

he hecho un echo y esto es lo que me muestra

select r.*, b.*,j.*,c.*,t.*,th.*,m.* (((((((from referencia r left join book b)left join book b on r.Id_Reference=b.Id_Rerence) left join journal j on r.Id_Reference=j.Id_Reference) left join conferencia c on r.Id_Reference=c.Id_Reference) left join thecnical_report t on r.Id_Reference=t.Id_Reference) left join thesis th on r.Id_Reference=th.Id_Reference) left join miscellaneous m on r.Id_Reference=m.Id_Reference) where r.Author like '%a'

"a" es el caracter que introduje para buscar

Gracias, espero que ahora puedas ver mejor el error que estoy cometiendo
  #8 (permalink)  
Antiguo 17/12/2004, 03:54
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
Yo de entrada veo un pequeño error: cruzas dos veces con la tabla book y en la primera no metes la condición de cruce:
Código:
select r.*, b.*,j.*,c.*,t.*,th.*,m.* 
from 
(
 (
  ( 
   (
    (
     (referencia r left join book b on r.Id_Reference=b.Id_Rerence
     ) 
     left join journal j on r.Id_Reference=j.Id_Reference
    ) 
    left join conferencia c on r.Id_Reference=c.Id_Reference
   )
   left join thecnical_report t on r.Id_Reference=t.Id_Reference
  )
  left join thesis th on r.Id_Reference=th.Id_Reference
 )
 left join miscellaneous m on r.Id_Reference=m.Id_Reference
) 
where r.Author like '%a'
Esto te debería devolver algo, siempre y cuando tengas algún autor cuyo nombre finalice por "a".
Un saludo.
__________________
Estoy contagiado de Generación-I

Última edición por Vice; 17/12/2004 a las 04:06
  #9 (permalink)  
Antiguo 17/12/2004, 06:52
 
Fecha de Ingreso: agosto-2002
Mensajes: 230
Antigüedad: 21 años, 8 meses
Puntos: 1
Cita:
Iniciado por aimar_20
lo que he probado es:
select * from referencia r, book b, conferencia c, etc.., así con todas las tablas
luego en la clausula where
pongo
where r.id_referencia=b.id_referencia or b.id_referencia=c.id_referencia...
asi con las demas tablas
esto lo hago para poder extraer los datos especificos de cada tabla.
Ademas a la clausula where, despues de esto, le añado
and r.author like '$author' .....
y asi con los demas campos que tiene el buscador


de que otra manera podria enlazar las claves ajenas para que me muestre los resultados correctamente. asi lo que hace es que me muestra todos los registros de mi tabla, pero no funciona correctamente.

Alguien sabe como podria hacer esto, si es que hay manera de hacerlo?
has probado el union?la idea sería algo así

select * from referencia r, book b
where r.id_referencia=b.id_referencia
union
select * from book b, conferencia c
wherer b.id_referencia = c.idreferencia

todas las consultas deberían devolver los mismos campos para que no diera error

espero que te sirva
  #10 (permalink)  
Antiguo 17/12/2004, 13:03
 
Fecha de Ingreso: junio-2004
Mensajes: 101
Antigüedad: 19 años, 10 meses
Puntos: 0
no hay manera..

lo he probado tanto con el left join y con el union........
  #11 (permalink)  
Antiguo 20/12/2004, 02:18
 
Fecha de Ingreso: agosto-2002
Mensajes: 230
Antigüedad: 21 años, 8 meses
Puntos: 1
te da algún error o simplemente no te devuelve lo que quieres?
  #12 (permalink)  
Antiguo 21/12/2004, 11:54
 
Fecha de Ingreso: junio-2004
Mensajes: 101
Antigüedad: 19 años, 10 meses
Puntos: 0
se me acaba de ocurrir lo siguiente, pero no funciona del todo bien

para solucionar la busqueda sin saber el tipo de articulo. he pensado buscar la clave primaria en base a lo q se introduzca. y una vez obtenida esta clave ajena, buscar en cada tabla y si se obtiene un resultado, enlazar esa tabla con la principal y mostrar los resultados.

He probado, y funciona bien, si solo hay un resultado con los datos especificados, pero si hay informacion de distintas tablas, no funciona, me dice q no hay resultados. Para solucionarlo, pense en q si entra en journal y ha entrado en book buscar en ambas tablas, pero creo q tampoco funciona.

el error creo q lo tengo en el while xq supongo q solo buscara por el primer idref encontrado.

case 'any':
$sql="select Id_Reference from reference where 1 ";
if (!empty($title)) $sql.= "AND Title like '%".$title."%'";
if (!empty($author)) $sql.= "AND Author like '%".$author."%'";
$result=mysql_query($sql);

while ($row=mysql_fetch_array($result)) {
$idref=$row['Id_Reference'];
//una vez he obtenido el id_reference en cuestión, busco en cada una de las tablas, y si obtengo un resultado es xq funciona correctamente.

//buscamos en la tabla book
$sqlbook="select * from book b where Id_Reference='$idref'";

$resultbook=mysql_query($sqlbook);

if(mysql_num_rows($resultbook)>0)
{
//echo "esta en la tabla book";
//esta en la tabla book, por lo que ejecuto con la sentencia _pagi_sql;
$_pagi_sql.=",book b where r.Id_Reference=b.Id_Reference ";
if (!empty($title)) $_pagi_sql.= "AND r.Title like '%".$title."%'";
if (!empty($author)) $_pagi_sql.= "AND r.Author like '%".$author."%'";
}
//buscamos en la tabla journal
$sqljournal="select * from journal where Id_Reference='$idref'";
$resultjournal=mysql_query($sqljournal);
if(mysql_num_rows($resultjournal)>0)
{
//si encontro resultados en book, busco en ambas tablas
if(mysql_num_rows($resultbook)>0) {
$_pagi_sql.=",book b, journal j where r.Id_Reference=j.Id_Reference and r.Id_Reference=b.Id_Reference ";
if (!empty($title)) $_pagi_sql.= "AND r.Title like '%".$title."%'";
if (!empty($author)) $_pagi_sql.= "AND r.Author like '%".$author."%'";
}
else {
$_pagi_sql.=",journal j where r.Id_Reference=j.Id_Reference ";
if (!empty($title)) $_pagi_sql.= "AND r.Title like '%".$title."%'";
if (!empty($author)) $_pagi_sql.= "AND r.Author like '%".$author."%'";
}
}
//buscamos en la tabla conference
$sqlconference="select * from conference where Id_Reference='$idref'";
$resultconference=mysql_query($sqlconference);
if(mysql_num_rows($resultconference)>0)
{
$_pagi_sql.=",conference c where r.Id_Reference=c.Id_Reference ";
if (!empty($title)) $_pagi_sql.= "AND r.Title like '%".$title."%'";
if (!empty($author)) $_pagi_sql.= "AND r.Author like '%".$author."%'";
}
//buscamos en la tabla technical_report
$sqltechnical="select * from technical_report where Id_Reference='$idref'";
$resulttechnical=mysql_query($sqltechnical);
if(mysql_num_rows($resulttechnical)>0)
{
$_pagi_sql.=",technical_report t where r.Id_Reference=t.Id_Reference ";
if (!empty($title)) $_pagi_sql.= "AND r.Title like '%".$title."%'";
if (!empty($author)) $_pagi_sql.= "AND r.Author like '%".$author."%'";
}
//buscamos en la tabla thesis
$sqlthesis="select * from thesis where Id_Reference='$idref'";
$resultthesis=mysql_query($sqlthesis);
if(mysql_num_rows($resultthesis)>0)
{
$_pagi_sql.=",thesis th where r.Id_Reference=th.Id_Reference ";
if (!empty($title)) $_pagi_sql.= "AND r.Title like '%".$title."%'";
if (!empty($author)) $_pagi_sql.= "AND r.Author like '%".$author."%'";
}
//buscamos en la tabla miscellaneous
$sqlmisc="select * from miscellaneous where Id_Reference='$idref'";
$resultmiscellaneous=mysql_query($sqlmiscellaneous );
if(mysql_num_rows($resultmiscellaneous)>0)
{
$_pagi_sql.=",miscellaneous m where r.Id_Reference=m.Id_Reference ";
if (!empty($title)) $_pagi_sql.= "AND r.Title like '%".$title."%'";
if (!empty($author)) $_pagi_sql.= "AND r.Author like '%".$author."%'";
}

}//fin del while

break;


Creo q voy por buen camino, pero no se como buscar si hay mas de un resultado q pueda coincidir con los datos introducidos. Como podria reescribir esto para que funcione

Gracias
  #13 (permalink)  
Antiguo 22/12/2004, 01:48
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
Esa consulta que tu haces en un bucle es lo mismo que hacer la union de todas las consultas. Cuidado que hay que tener con una union: todas las selects deben devolver el mismo número de valores y del mismo tipo sino te dará un error en ejecución.
Código:
select 'Book',* 
from referencia r join book b on r.Id_Reference=b.Id_Rerence
where r.Author like '%a'
and r.Title like '%title%'
union all
select 'Journal',* 
from referencia r join journal j on r.Id_Reference=j.Id_Reference
where r.Author like '%a'
and r.Title like '%title%'
union all
select 'Conferencia',* 
from referencia r join conferencia c on r.Id_Reference=c.Id_Reference
where r.Author like '%a'
and r.Title like '%title%'
union all
select 'Thech-report',* 
from referencia r join thecnical_report t on r.Id_Reference=t.Id_Reference
where r.Author like '%a'
and r.Title like '%title%'
union all
select 'Thesis',* 
from referencia r join thesis th on r.Id_Reference=th.Id_Reference
where r.Author like '%a'
and r.Title like '%title%'
union all
select 'Miscellaneous',* 
from referencia r join miscellaneous m on r.Id_Reference=m.Id_Reference 
where r.Author like '%a'
and r.Title like '%title%'
Esto te tiene que funcionar. Al fin y al cabo es lo mismo que tú estás haciendo por programación, pero en una única consulta a la base de datos.
Recuerda: todas las selects deben develver el mismo número de datos y del mismo tipo. Si en una select quieres que te devuelva un número, pero no en el resto, es tan fácil como en esa posición de las demás selects meter un número como una constante.
En las selects he puesto un '*', porque no sé que datos quieres y no conozco la estructura de tus tabla, lo habitual, es enumerar exactamente los campos que se quieren, pues si lo has separado en tablas es de suponer que no tienen igual estructura. La constante inicial es para conocer de que tabla viene el dato, si no lo necesitas conocer, la quitas.

Espero que esto te sirva y te facilite las cosas.

Un saludo.
__________________
Estoy contagiado de Generación-I

Última edición por Vice; 22/12/2004 a las 01:54
  #14 (permalink)  
Antiguo 23/12/2004, 05:18
 
Fecha de Ingreso: junio-2004
Mensajes: 101
Antigüedad: 19 años, 10 meses
Puntos: 0
creo q no me servira xq cada tabla tiene unos campos distintos

creo q no me servira xq cada tabla tiene unos campos distintos. Las tablas se corresponden con articulos distintos, y cada uno de ellos requiere de unos campos distintos a las otras tablas
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 05:39.