Foros del Web » Programando para Internet » PHP »

consultar varias tablas simultaneamente

Estas en el tema de consultar varias tablas simultaneamente en el foro de PHP en Foros del Web. Hola Tengo una base de datos compuesta por distintas tablas completamente identicas (todas ellas tienen los mismos campos). Bien, necesito hacer una busqueda que consulte ...
  #1 (permalink)  
Antiguo 16/02/2006, 09:54
 
Fecha de Ingreso: enero-2003
Mensajes: 23
Antigüedad: 14 años, 10 meses
Puntos: 0
consultar varias tablas simultaneamente

Hola

Tengo una base de datos compuesta por distintas tablas completamente identicas (todas ellas tienen los mismos campos).

Bien, necesito hacer una busqueda que consulte todas las tablas y me devuelva el nombre de la tabla en la que está y los valdores que tiene...

El número de tablas varía frecuentemente por lo que no se trata de hacer una consulta a las tablas 1, 2, 3, 4,.... si no de forma global para no tener que ir añadiendo y quitando tablas a la consulta cada dos por 3...

De que forma puedo hacer esto...
  #2 (permalink)  
Antiguo 16/02/2006, 10:00
Avatar de mauled  
Fecha de Ingreso: marzo-2005
Ubicación: Cd. de México.
Mensajes: 3.001
Antigüedad: 12 años, 9 meses
Puntos: 33
Petrusco esta pregunta hazla por favor en el foro de base de datos
  #3 (permalink)  
Antiguo 16/02/2006, 10:02
 
Fecha de Ingreso: enero-2003
Mensajes: 23
Antigüedad: 14 años, 10 meses
Puntos: 0
Bueno, la consulta a el mysql la quiero hacer con PHP, ¿aun así corresponde hacerla en bases de datos???.

Si es así puedes decirme como desviarla.. Se que se puede para no duplicar consultas pero no se como...

Gracias
  #4 (permalink)  
Antiguo 16/02/2006, 10:50
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por petrusco
Bueno, la consulta a el mysql la quiero hacer con PHP, ¿aun así corresponde hacerla en bases de datos???.

Si es así puedes decirme como desviarla.. Se que se puede para no duplicar consultas pero no se como...

Gracias
Bueno .. tienes bastantes cosas que son de SQL en sí (y diseño de base de datos en general, normalización ...) .. y otras que necesitaras PHP aunque con SQL sólo y poco PHP (el justo para "ejecutar" la sentencia SQL) te sobraría.

Me gustaría preguntarte antes de nada .. por qué tienes "tantas tablas" y que son "dinámicas" (que no sabes cuantos son .. o como se llamen).

Te hago el comentario por qué -a lo peor- estás enfocando mál el desarrollo de tu modelo de datos (BBDD y tablas que lo componene) .. Es muy común que cuando uno empieza a diseñar "base de datos" se empeñe en crear "tablas" para algunas cosas que bien "normalizado" no se hacen con "tablas" sino con "registros" de UNA tabla relacionadas con otras ...

Si quieres seguir con tu idea .. Lo que necesitas primero es obtener el nombre de las tablas que puedas tener en una BBDD:

mysql_list_tables()
http://www.php.net/manual/en/functio...ist-tables.php

Pero también se puede hacer por SQL:
SHOW TABLES FROM nombre_BBDD

(ejemplo tienes en la documentación de PHP al respecto).

Luego tienes otras funcionse al estilo la anterior para ver los campos que tiene una tabla concreta ("fields") ..

Realmente no veo muy óptimo tener que hacer este proceso a cada busqueda .. Por eso te pregunto acerca de tu "modelo de datos" y como lo has diseñado .. por qué usar "tablas" para gestionar datos en lugar de "registros" no se presta muy bien por ejemplo para hacer este tipo de busquedas que pretendes hacer.

Un saludo,
  #5 (permalink)  
Antiguo 16/02/2006, 11:00
 
Fecha de Ingreso: enero-2003
Mensajes: 23
Antigüedad: 14 años, 10 meses
Puntos: 0
Hola Cluster

Bueno, el que haya bastantes tablas y que varíen es debido a que cada tabla es de un cliente.

Es decir, es la db clientes y cada cliente tiene su tabla y dentro de cada una de ellas los distintos productos que nos compran a lo largo del tiempo....

No se si sea la mejor forma en su momento pareción la mas lógica....

Claro los clientes cambian, vienen de nuevos y otros dejan de serlo y con ellos las tablas...

Bueno, voy a ver si con la información que me has dado consigo hacer esto.

Gracias
  #6 (permalink)  
Antiguo 16/02/2006, 11:16
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Bueno, el que haya bastantes tablas y que varíen es debido a que cada tabla es de un cliente.

Es decir, es la db clientes y cada cliente tiene su tabla y dentro de cada una de ellas los distintos productos que nos compran a lo largo del tiempo....
Este es el primer problema de diseño de tu modelo de datos ...!!!

Te pongo un ejemplo simple de como "normalizar" este tema:

Tabla clientes
id_cliente
nombre
blablabal

Tabla Pedidos
id_pedido
pedido_numero
referencia
observaciones

Tabla Detalle Pedido
id_detalle_pedido
id_pedido
id_producto
cantidad

Taba Productos
id_producto
nombre
precio_base
blablabla

Te fijas? .. Esto se denomina "normalización" .. Cada cliente es un "registro" dentro de esa tabla "clientes" .. se relaciona con las otras por sus identifiacodes (claves primarias y foráneas).

Por ejemplo ahí te describí una estructura básica de clientes, productos y pedidos .. bajo esos "id_xxxx" relaciono todo .. así es simple ir a buscar algo de un cliente .. presentar sus "pedidos" .. y en general mantener este sistema de una forma coherente y con mucho SQL y poco "PHP" por médio.

Te recomendaría leer sobre "diseño de base de datos" y "normalización" en los tutoriales que podrás ver en:
www.mysql-hispano.com

Un saludo,
  #7 (permalink)  
Antiguo 16/02/2006, 17:30
 
Fecha de Ingreso: enero-2003
Mensajes: 23
Antigüedad: 14 años, 10 meses
Puntos: 0
He estado revisando lo que comentas y creo que tienes toda la razón... Aunque la verdad supone reestructurar todo lo que supondrá un buen trabajo.

Lo único que me preocupa es que si juntamos todos los registros en una misma tabla un el id de los distintos clientes... Estamos hablando de una tabla de alrededor de 20.000 registros.. Esa tabla es consultada frecuentemente por los clientes...

Lo que me preocupa es que se nos cuelgue la aplicación o les tarde mucho en mostrar resultados, etc... Claro ahora apenas son 500, 700 registros por consulta como mucho

¿que opinas sobre esto, sería un problema???
  #8 (permalink)  
Antiguo 17/02/2006, 00:34
Avatar de uamistad  
Fecha de Ingreso: diciembre-2004
Ubicación: Cd. de México
Mensajes: 1.395
Antigüedad: 13 años
Puntos: 1
Información el diseño lo es todo

No sería un problema en absoluto.

Si tu haces un buen diseño de base de datos y bien normalizado, lo único que tendrás que hacer para migrar de uno a otro será consultar cada una de tus tablas actuales e irlas insertando en el nuevo diseño de base de datos.

Un diseño normalizado te permite:
  • facilidad para actualizar tu información.
  • ocupar el menor espacio posible.
  • evitar redundancia de información.
  • escalar tu sistema conforme lo vas necesitando.
Permíteme ilustrarlo con un ejemplo, digamos que tienes 20 clientes, ¿ok?

Entonces, respondiendo a tu consulta:

Cita:
Bien, necesito hacer una busqueda que consulte todas las tablas y me devuelva el nombre de la tabla en la que está y los valdores que tiene...
Tendrías que hacer 20 consultas diferentes a la base de datos (a cada una de las tablas).

Si tuvieras todo normalizado, podrías acceder a lo que necesitas en una sola consulta.
__________________
"Di no al Internet Explorer" -Proverbio Chino-
  #9 (permalink)  
Antiguo 17/02/2006, 06:10
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Las base de datos "relacionadas" están diseñadas para eso .. Mira las características de "Mysql" .. soporta millones de registros por tablas.

Justamente el "limite" de tablas es mucho menor que el de registros por tabla. ¿o al final vas a tener "20.000" tablas? una por cliente?.

Según tu "normalizes" mejor tu modelo de datos, así se podrán optimizar las consultas a tu BBDD, eliminar redundancias y en general optimizar el sistema.

Un saludo,
  #10 (permalink)  
Antiguo 17/02/2006, 06:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
He estado revisando lo que comentas y creo que tienes toda la razón... Aunque la verdad supone reestructurar todo lo que supondrá un buen trabajo.
Bueno .. eso es lo que pasa cuando no se analiza bien el problema o se desconocen algunas cosas como toda la teória de "Normalización" (no sé si la conocian .. pero es lo más básico dentro del diseño de un "modelo de datos" para una BBDD).

Lo bueno es que esto te sirve de experiencia .. Si quieres seguir como estás .. cada vez más se te va complicar hacer taréas tan simples con un buen modelo de datos y tan complicado como lo tienes ahora.

Un saludo,
  #11 (permalink)  
Antiguo 17/02/2006, 06:33
 
Fecha de Ingreso: enero-2003
Mensajes: 23
Antigüedad: 14 años, 10 meses
Puntos: 0
No, la verdad es que no lo conocía.. Soy bastante novato en esto...

De hecho ya he empezado a cambiar la estructura y ahora me encuentro con un problema (seguro que muy tonto).

Con la estructura anterior tenía consultas del tipo:

$con = mysql_connect("localhost","usuario","pass");
mysql_select_db("db",$con) ;
$_pagi_sql = "SELECT campo1, campo2, campo3, vencimiento FROM tabla WHERE campo1 LIKE '$letra%' ORDER BY vencimiento";

Que ocurre que ahora "tabla" deja de existir y necesito hacer 2 consultas WHERE dentro de la tabla para encontrar el resultado que busco.. he probado varias formas pero todas ellas me dan error (vamos que no puedo duplicar el where)...

¿como se haría dicha consulta ahora?????

Gracias
  #12 (permalink)  
Antiguo 17/02/2006, 06:58
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Que ocurre que ahora "tabla" deja de existir y necesito hacer 2 consultas WHERE dentro de la tabla para encontrar el resultado que busco.. he probado varias formas pero todas ellas me dan error (vamos que no puedo duplicar el where)...
Creo que vas muy rápido .. apenas ayer te enterastes del concepto de "normalización" y hoy ya estás hacienco consultas SQL a ese "nuevo modelo de datos"?.

Tu ya has "pensado" bien tu modelo de datos .. lo tienes todo claro? .. ya has creado tus nuevas tablas, definido sus relaciones en función de lo que puedas necesitar de ellas?

-------------

No sé a que te refieres con "dos consultas" dentro de una tabla .. Tampoco muestras la estructura de esa tabla (o tablas) implicadas (para hacerse una idea).

Sólo te comento (por si lo desconocias) que en el SQL existen "operadores lógicos" como AND/OR .. así que si entendí bien y tu tienes que hacer una consulta SQL por un valor determinado de tal campo y otro valor determinado de otro campo .. usa:

SELECT * FROM tabla WHERE campo1='$buscar' AND campo2='$buscar'

O usar LIKE .. o combinación de estas .. En fin .. el "SQL" es un lenguaje que debes conocer en profundidad para sacar provecho a tu "modelo de datos".

Intenta realizar estas consultas en el foro de "Base de datos" (indicando que usas Mysql y siempre con la estructura de las tablas implicadas en la mano).

Un saludo,
  #13 (permalink)  
Antiguo 17/02/2006, 07:17
 
Fecha de Ingreso: enero-2003
Mensajes: 23
Antigüedad: 14 años, 10 meses
Puntos: 0
Bueno, realmente tampoco hay tanto que estructurar.. Quiero decir..

habia 2 bases de datos:

db1
db2

En db1 esta la tabla clientes con un registro por cliente, una tabla de precios y otra de configuración del cliente

Y la db2 es la que tenía unfinidad de tablas una por cliente para productos...

he copiado los contenidos de esa db2 y los e añadido a una tabla en db1 que se llama productos y que se vincula con la tabla clienes por el id de cliente....

De esta forma si se facilitan muchisimo todas las ampliaciones que tenía en mente.. El problema es que me he perdido en la forma de hacer lo que ya está hecho como es el caso de dicha consulta..

Si conozco los operadores lógicos pero no funcionan:

$_pagi_sql = "SELECT campo1, campo2, campo3, vencimiento FROM dominios WHERE campo1='$letra%' AND id='$variable1' ORDER BY vencimiento";

No me muestra ningún resultado... No da error no hace nada... Si pongo solo una condición me muestra resultados pero con las 2 simplemente nada....
  #14 (permalink)  
Antiguo 17/02/2006, 08:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
petrusco ..

No sé si usas algún administrador de BBDD Msyql .. tipo phpMyadmin, Navicat, Mysql Front End .. o cualquier otro.

El caso es que debes probar para asegurarte bien que tu consulta SQL según tu "modelo de datos" (la estructura de datos y datos en sí) funcionen.

Para eso, .. toma ese "phpMyadmin" o el gestor (GUI) de Msyql que uses y ejecuta con datos fijos tu consulta SQL. (da valores que conozcas a tus variables). Ahí veras si realmente tu consulta SQL funciona y arroja los resultados esperados.

Si la consulta SQL como tal funciona con datos "fijos" . .habrá que ver si tus variables están tomando los datos esperados (hazte un echo a tu $_pagi_sql) y por último del própio código que usas para extraer tus datos desde PHP.

Por otro lado ... no sé si la consulta SQL que estás haciendo interviene sólo una tabla o hay datos de más tablas involucrados .. Te hago el comentario para que estudies sobre "INNERT JOIN" y demás técnicas SQL para hacer consultas SQL donde intervengan más de una tabla y así no tener que hacer consultas SQL "simples" para ir sacando datos de tablas relacionadas cuando se -debe- obtener en lo posible con UNA sóla sentencia SQL (eso sí .. cada vez más compleja).

En realidad si trabajas con una BBDD y "datos" .. los "datos" que necesitas deberías obtenerlos siemper y en la medida de lo posible con SQL .. PHP sólo usarlo para "pasar" datos de "criterio" a buscar/filtrar y leer/obtener los datos que la consulta SQL genere como "salida".

Un saludo,
  #15 (permalink)  
Antiguo 17/02/2006, 08:17
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
$_pagi_sql = "SELECT campo1, campo2, campo3, vencimiento FROM dominios WHERE campo1='$letra%' AND id='$variable1' ORDER BY vencimiento";

OJO .. esta sentencia SQL no es correcta (o no veras los resultados esperados) .. El "%" se usa con LIKE y es un "comodin" (wildcard) .. en un "=" no corresponde.

No sé que código usas para ejecutar esa sentencia SQL .. pero deberías usar un mysql_error() para ver el error exacto de conexión o SQL (sintax) que pudieras tener.

$resultado=mysql_query(.....) or die (mysql_error());

Un saludo,
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 16:31.