Comunidad de diseño web y desarrollo en internet online

Sumar columnas de multiples tablas...

Citar            
MensajeEscrito el 19 Feb 2009 03:59 pm
Saludos!...

Tengo una base de datos que contiene unas cien (100) tablas con identica estructura. Estas tablas clasifican la información que un grupo de usuarios registra. Dicha información se guarda en una u otra tabla dependiendo de ciertos parámetros desarrollados en PHP.

En fin, en dichas tablas hay un campo que contiene un número 1 o 2. Cada usuario al registrar su información se le adjudica (dependiendo de otros criterios) un uno (1) o un dos (2).

¿Cuál es la idea?... Consiste en tomar toda la base de datos con todas sus tablas y buscar cuantos unos (1) y cuantos dos (2) tiene ese usuario en el momento de loguearse. Lo que quiero decir es que no necesito una estadística general para todos, solamente para el usuario que se encuentra logueado.

Así, el parámetro inicial sería identificar al usuario y asignarle una variable. A manera de ejemplo incluyo la siguiente variable:

Código :

$usuario = 'pepe';


Por su puesto, antes listo todas las tablas contenidas en la base de datos:

Código :

$sql = "SHOW TABLES FROM $basededatos";
$result = mysql_query ($sql);
while ($row = mysql_fetch_row ($result)) {

// Hago la consulta para el numero 1
$sql1 = "SELECT * FROM " .$row[0]. " WHERE usuario = '$usuario' AND codigo ='1' ";
$result1 = mysql_query ($sql1) or die ('Query failed: ' . mysql_error());
$num1 = mysql_num_rows($result1);
$total_sql1 += ($num1); 

// Hago la consulta para el numero 2
$sql2 = "SELECT * FROM " .$row[0]. " WHERE usuario = '$usuario' AND codigo ='2' ";
$result2 = mysql_query ($sql2) or die ('Query failed: ' . mysql_error());
$num2 = mysql_num_rows($result2);
$total_sql2 += ($num2); 


Con este pequeño código no obtengo ningún problema de sintaxis o de expresiones; pero sólo obtengo el resultado de la primera tabla y no de todas las cien que tengo en mi base de datos.

Pregunta...
¿Cómo puedo hacer para que me devuelva el resultado de todas las tablas y no solo de la primera?

Gracias por vuestra ayuda.

Andrew P.

Por andrewp

54 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 19 Feb 2009 09:02 pm
Ya va... ¿Tienes 100 tablas con exactamente la misma estructura? :?

Por KB-27

Claber

301 de clabLevel



 

My very secret HQ

firefox
Citar            
MensajeEscrito el 19 Feb 2009 09:40 pm
Gracias si podéis darme alguna ayuda al tema... :wink:

Por andrewp

54 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 20 Feb 2009 07:59 am
Unifica las tablas en solo 1, y crea un campo que diferencie que tabla deberia ser. Para hacer este tipo de consultas todo te será mas senzillo.

Por Joanlgr

15 de clabLevel



Genero:Masculino  

Eterno aprendiz

firefox
Citar            
MensajeEscrito el 20 Feb 2009 08:22 am
Joanlgr... Muchas gracias!

El problema es que me he encontrado con este lío, no lo he desarrollado yo y unificar todo a una sola tabla (lo más lógico) traería una cola de cambios inmensa en todo el código que se ha desarrollado en esta estructura.

168Por qué hay tantas tablas con la misma estructura?... Técnicamente no veo una respuesta pero administrativamente parece ser que lo decidieron de esta manera pensando que para cada materia debería haber una tabla a través del cual los profesores pueden implementar sus propias consultas. Si algun profesor daña algo no irá más allá de su tabla y no la de otros profesores. Es un sitio en el que todos se creen informáticos y "cacharrean" con consultas... Ya sé que es peligroso pero desde mi punto "laboral" no puedo hacer nada más de que lo que se me asigna.

Lo curioso del caso es que he probado hacer las mismas consultas directamente en un terminal linux y obtengo los resultados pero al pasar la misma formula reemplazando una tabla 'n' por todas las tablas "nnnn' en una variable como la muestro en el codigo citado me arroja solo el de la primera tabla.

Espero poder llegar a una solución del tema.

Gracias!

Por andrewp

54 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 20 Feb 2009 08:57 am
Haz un print_r($row), a ver que estructura tiene lo que te devuelve el primer select.

Por Joanlgr

15 de clabLevel



Genero:Masculino  

Eterno aprendiz

firefox
Citar            
MensajeEscrito el 20 Feb 2009 11:25 am
Gracies!...

El row me devuelve el nombre de las tablas en forma de array:

Código :

Array ( [0] => matematicas ) Array ( [0] => lengua_inglesa ) Array ( [0] => ciencias_nivel1 ) Array ( [0] => ciencias_nivel2 ) Array ( [0] => ciencias_nivel3 ) .... hasta cien asignaturas...

Por andrewp

54 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 20 Feb 2009 11:42 am
Prueba a poner $row a secas, sin el [0]

Por Joanlgr

15 de clabLevel



Genero:Masculino  

Eterno aprendiz

firefox
Citar            
MensajeEscrito el 20 Feb 2009 12:10 pm
Bien... El resultado que te dí anteriormente fue sin '[0]'... Si lo pongo a la variable obtengo la lista sin array:

print_r (row[0]);

matematicaslenaguaciencias_nivel1cienciasnivel2......

Por andrewp

54 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 20 Feb 2009 02:06 pm
No no, digo poner $row a secas en las sentencias SQL.

Por Joanlgr

15 de clabLevel



Genero:Masculino  

Eterno aprendiz

firefox
Citar            
MensajeEscrito el 21 Feb 2009 09:38 pm
Si hago eso me genera un error diciéndome que no puede leer el array...

Por andrewp

54 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 23 Feb 2009 07:14 am
Pues ya no se me ocurre nada mas, el código parece estar bién.

Por Joanlgr

15 de clabLevel



Genero:Masculino  

Eterno aprendiz

firefox
Citar            
MensajeEscrito el 23 Feb 2009 01:47 pm

andrewp escribió:

Si hago eso me genera un error diciéndome que no puede leer el array...

en ese caso coloca un var_dump($row)

Por jpcw

Claber

1715 de clabLevel

1 tutorial

Genero:Masculino  

AlgoritmicBrainDesigner

firefox
Citar            
MensajeEscrito el 23 Feb 2009 10:52 pm
Gracias a todos...

Finalmente he tenido que añadir una base e datos a manera de LOGs que recoja la información (a manera limtada) de los eventos que se incluyan en los diferentes "INSERTs"... Así puedo generar una consulta sencilla a una sola tabla llena de unos (1s) y dos (2s).

De cualquier manera, gracias por vuestra ayuda!

Andrew P.

:zzz:
POST a dormir!

Por andrewp

54 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 25 Feb 2009 04:33 am
Hola, como va?

Mira, fijate si esto te sirve

Código :

$usuario = "pepe";

mysql_connect("localhost", "root", "");

$result = mysql_list_tables("weblog");

$num_rows = mysql_num_rows($result);

$acum1 = 0;
$acum2 = 0;

for ($i = 0; $i < $num_rows; $i++) {
    $tableName = mysql_tablename($result, $i);
    
    $sql = "SELECT COUNT(usuario) as cantidad FROM " .$tableName. " WHERE usuario = '$usuario' AND codigo ='1' ";   
    if ( $result = mysql_query($sql) )
    {
      if ( $obj = mysql_fetch_assoc($result) )
      {
          $acum1 += $obj->cantidad;
      }
    }

    $sql = "SELECT COUNT(usuario) as cantidad FROM " .$tableName. " WHERE usuario = '$usuario' AND codigo ='2' ";   
    if ( $result = mysql_query($sql) )
    {
      if ( $obj = mysql_fetch_assoc($result) )
      {
          $acum2 += $obj->cantidad;
      }
    }
}

mysql_free_result($result);


Fijate q hay funciones especificas para conocer las tablas de una base de datos (mysql_list_tables y mysql_tablename)

saludos1

Por alfathenus

833 de clabLevel

5 tutoriales

 

buenos aires || Argentina

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.