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

Busqueda de datos entre barias tablas.

Estas en el tema de Busqueda de datos entre barias tablas. en el foro de Bases de Datos General en Foros del Web. Hola buen dia! si me podrian ayudar. tengo la siguite tabla: libros con los siguientes campos: serial, titulo, autor, isbn tengo una caja de seleccion ...
  #1 (permalink)  
Antiguo 14/04/2009, 23:28
 
Fecha de Ingreso: abril-2009
Mensajes: 4
Antigüedad: 15 años, 1 mes
Puntos: 0
Pregunta Busqueda de datos entre barias tablas.

Hola buen dia!
si me podrian ayudar.

tengo la siguite tabla: libros
con los siguientes campos: serial, titulo, autor, isbn

tengo una caja de seleccion y una caja de texto. (html)

si se quiere buscar por ejemplo el serial del libro, y ese serial comience por 123
me despliega una tabla con todos los seriales de los libros que comiencen por ese numero
ejemplo saldria asi:

|serial___|titulo|autor|isbn|
|12354879 |xxxxx |xxxx |xxxx |
|12387495 |xxxxx |xxxx |xxxx |

Si se quiere buscar el titulo del libro, y ese titulo sea “el mago merlin”
Me despliega una tabla con todos los titulos que tengan esas palabras
Saldria asi:

|serial|titulo__________|autor|isbn|
|xxxxx |el mago merlin____ |xxxx |xxxx |
|xxxxx |el mago y sus elfas |xxxx |xxxx |

Si se quiere buscar el autor del libro, y ese autor sea “luis cortes”
Me despliega una tabla con todos los autores que tengan esas palabras
Saldria asi:

|serial|titulo|autor____|isbn|
|xxxx |xxxxx |luis cortes |xxxx |
|xxxx |xxxxx |pedro y luis |xxxx |

Si se quiere buscar el isbn del libro, y ese isbn sea “0-35489”
Me despliega una tabla con todos los isbn que empiecen por esos numeros
Saldria asi:

|serial|titulo|autor|isbn___|
|xxxx |xxxxx |xxxx |0-35489 |
|xxxx |xxxxx |xxxx |0-35489 |

ahora la sentencia que hace todo esto y hace la consulta a la base de datos es esta:

Cita:
$c="select * from libros where ".$tipobusqueda." like '%".$terminobusqueda."%'";
en donde $tipobusqueda es la caja de seleccion y $terminobusqueda es la caja de texto

este codigo busca de esta manera en un sola tabla, pero como hago para que me busque de esta manera en varias tablas? o si hay otra forma?
ademas que le faltaria a las tablas para que haga esta operacion?
Tengo que relacionar las tablas?

si por ejemplo los campos: serial, titulo, autor, isbn....estubieran en otras tablas??

ejemplo:

tabla: libro1
campo: serial

tabla: libro2
campo: titulo

tabla: libro3
campo: autor

tabla: libro4
campo: isbn

como se puede hacer?? como las busco para que me salga un tabla asi:

|serial|titulo|autor|isbn|
|xxxxx |xxxxx |xxxx |xxxx |
|xxxxx |xxxxx |xxxx |xxxx |


Quiero aprender.

gracias de antemano

Última edición por joseac; 15/04/2009 a las 22:16
  #2 (permalink)  
Antiguo 15/04/2009, 15:27
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 9 meses
Puntos: 39
Respuesta: Busqueda de datos entre barias tablas.

Prueba asi:
Código sql:
Ver original
  1. $c="select L1.*
  2. from libro1 L1
  3. inner join libro2 L2 on L1.id=L2.id
  4. inner join libro3 L3 on L1.id=L3.id
  5. inner join libro4 L4 on L1.id=L4.id
  6. where L1.serial like '%'
  7. or L2.titulo like '%'
  8. or L3.autor like '%'
  9. or L4.isbn like '%'";
Modificalo como lo necesitas. Creo que la idea principal esta clara.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 15/04/2009, 16:13
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 9 meses
Puntos: 70
Respuesta: Busqueda de datos entre barias tablas.

Hola...

Según lo que veo es que joseac lo que necesita es buscar ese criterio en n tablas sin tener en cuenta la relación no?

Si es así, te tocaría ayudarte por programación mediante un ciclo que recorra las tablas que tú le digas y vayas guardando los resultados con coincidencias.

Intentaste lo que te dice flaviovich? Te sirvió?

Saludos
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #4 (permalink)  
Antiguo 15/04/2009, 23:55
 
Fecha de Ingreso: abril-2009
Mensajes: 4
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Busqueda de datos entre barias tablas.

hola Carxl edite el tema para que se entienda mejor. en verdad no logro encontrar la sentencia que me ayude hacer esto, incluso la que me ofrecio flaviovich que es interesante, la estoy analizando pero no he podido lograrlo

gracias flaviovich seguire intentando con la sentencia que me dejaste

gracias por la atencion
  #5 (permalink)  
Antiguo 16/04/2009, 07:07
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, 6 meses
Puntos: 2658
Respuesta: Busqueda de datos entre barias tablas.

El problema es en apariencia complicado, pero en realidad no lo es tanto.
El tema de base es que tienes los datos demasiado separados en tablas diferentes, a pesar de que ciertos datos son parte de la misma entidad, como es el caso de titulo e ISBN (El ISBN es único para cada edición de un título por una editorial y eso incluye tamaño, hojas, presentación y varias cosas más).
Pero para el caso la solución está dentro de lo que te planteó flaviovich en su post: Lo mejor es hacer que la búsqueda se realice sobre un conjunto de registros en los que ya se hayan depurado cualquier tipo de duplicaciones y faltas de datos.
Esto:
Código sql:
Ver original
  1. SELECT  *
  2. FROM  libro1 L1
  3.     INNER JOIN libro2 L2 USING(id)
  4.     INNER JOIN libro3 L3 USING(id)
  5.     INNER JOIN libro4 L4 USING(id)

Te debería devolver una tabla que contenga la totalidad de libros con su serial, titulo, autor e ISBN, por lo que debería ser suficiente para hacer la búsqueda.
El problema que le veo es que deben forzosamente existir TODAS las coincidencias para que te devuelva registros. Si alguna de las tablas no ha sido llenada con el id vinculado, ese registro no será devuelto, a pesar de que exista el resto de los datos (por ejemplo, si falta ingresar un ISBN, o un autor). En ese sentido es mejor usar LEFT JOIN, que te devuelve los resultantes, aunque sean nulos:
Código sql:
Ver original
  1. SELECT   titulo, IFNULL(autor,'') Autor, IFNULL(serial,'') serial, IFNULL(isbn,'') ISBN
  2. FROM  libro2 L2
  3.     LEFT JOIN libro1 L1 USING(id)
  4.     LEFT JOIN libro3 L3 USING(id)
  5.     LEFT JOIN libro4 L4 USING(id)

Verás que he incluido una función IFNULL(), eso es para evitar que los NULL aparezcan, sino que representa caracteres vacíos (NULL <> ''). También notarás que cambié el orden de los JOIN. Eso es porque un libro debe tener forzosamente título para figurar, aunque no se tenga ni autor, ni serial ni isbn. El tema allí es que la primera tabla tiene que devolver si o si valores y no nulos, de lo contrario, la consulta no devolverá el registro.

Finalmente, yo esto lo resolvería por una vista o por una subconsulta, para no complicarle la resolución al parser de MySQL.
Con una vista:
Código sql:
Ver original
  1. CREATE O REPLACE VIEW listaLibros AS
  2. SELECT   titulo, IFNULL(autor,'') Autor, IFNULL(serial,'') serial, IFNULL(isbn,'') ISBN
  3. FROM  libro2 L2
  4.     LEFT JOIN libro1 L1 USING(id)
  5.     LEFT JOIN libro3 L3 USING(id)
  6.     LEFT JOIN libro4 L4 USING(id);
Esto se debe ejecutar una sola vez y entonces la VIEW estará disponible para:
Código sql:
Ver original
  1. SELECT   titulo, IFNULL(autor,'') Autor, IFNULL(serial,'') serial, IFNULL(isbn,'') ISBN
  2. FROM  listalibros L
  3. WHERE titulo LIKE '%valor%'
  4.    OR autor LIKE '%valor%'
  5.    OR serial LIKE '%valor%'
  6.    OR isbn LIKE '%valor%';

En caso de querer hacerlo directo y sin VIEWs, sería mejor:

Código sql:
Ver original
  1. SELECT   titulo, IFNULL(autor,'') Autor, IFNULL(serial,'') serial, IFNULL(isbn,'') ISBN
  2. FROM  (SELECT   titulo, IFNULL(autor,'') Autor, IFNULL(serial,'') serial, IFNULL(isbn,'') ISBN
  3.             FROM  libro2 L2
  4.                 LEFT JOIN libro1 L1 USING(id)
  5.                 LEFT JOIN libro3 L3 USING(id)
  6.                 LEFT JOIN libro4 L4 USING(id)) L
  7. WHERE titulo LIKE '%valor%'
  8.    OR autor LIKE '%valor%'
  9.    OR serial LIKE '%valor%'
  10.    OR isbn LIKE '%valor%';
Pruébalo y me cuentas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 18:33.