Foros del Web » Programando para Internet » PHP »

Como puedo hacer lo siguiente

Estas en el tema de Como puedo hacer lo siguiente en el foro de PHP en Foros del Web. Que tal gente, estoy haciendo una pagina con PHP Y MySQL y tengo un problemita que quisiera compartir y me dijieran la mejor idea posible ...
  #1 (permalink)  
Antiguo 19/08/2007, 18:37
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Pregunta Como puedo hacer lo siguiente

Que tal gente, estoy haciendo una pagina con PHP Y MySQL y tengo un problemita que quisiera compartir y me dijieran la mejor idea posible y facil :)


Tengo una base de datos en MySQL. Nombre= "Software"

Ahora en "Software" tengo 3 tablas.
Tabla1
Tabla2
Tabla3

Cada tabla tiene un campo llamado "Calificacion"

Y mi intencion es copiar todas las tablas en una sola tabla para poder ordenar todos sus componentes por el campo "Calificacion" y asi poder visualizar los 5 primero, es una especie de TOP 5.

Ahora mi problema, no tengo 3 tablas, sino tengo como 20 tablas, entonces me preocupa el tiempo de ejecucion de ese sistema de copiar todas las tablas..

Alguna idea ? o como puedo implementar que copie todas las tablas a una ?

Gracias!
  #2 (permalink)  
Antiguo 19/08/2007, 19:24
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Re: Como puedo hacer lo siguiente

Bueno, muchas opciones no tenés. Podrías usar tablas temporales, o ver alguna manera como decís, pero para mi la mejor opción es un union, que también tabajaría del lado de php. Podrías hacerlo hasta dinámico (declarando tablas y campos en un array y luego hacer un for/foreach).

Una vez hecho, podés ordenar por un campo en común (campo calificacion). Ahora bien, hace esto en 20 tablas para memoria de mysql es pesado (no se que cantidad de vistas tenés pero es pesado). Lo que te recomiendo es armarte un cachee del resultado, y regenerarlo cada una hora o algo así.

En fin, son ideas que seguramente te ayuden a sacar las papas del horno.

saludos.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #3 (permalink)  
Antiguo 20/08/2007, 11:04
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Exclamación Copiar principio de tablas a otra (PHP + MySQL)

Entonces tengo 3 tablas en una base de datos mysql. y quiero ordenarlas a partir de la celda "calificacion" y copiar las 3 primeras filas de cada tabla a una nueva.

Ahora mi problema es si tengo 4 tablas.

es_tabla1
es_tabla2
es_tabla3
en_tabla4

Como hago para ir recorriendo las tablas con el prefijo es y copiando a la nueva tabla ?

Última edición por dieguito01; 20/08/2007 a las 11:50
  #4 (permalink)  
Antiguo 20/08/2007, 12:31
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Re: Como puedo hacer lo siguiente

Veo que no me comprendiste, en si, revisa como usar union, pero la consulta sería algo como:
Código PHP:
$sql "

(select codigo, nombre, calificacion from tbl1)
union
(select codigo, nombre, calificacion from tbl2)
union
(select codigo, nombre, calificacion from tbl3)
union
(select codigo, nombre, calificacion from tbl4)
union
(select codigo, nombre, calificacion from tbl5)
order by calificacion desc limit 5

"

__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #5 (permalink)  
Antiguo 20/08/2007, 13:09
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: Como puedo hacer lo siguiente

ahhh esta bien.. ahora busco como hacer la union. gracias
  #6 (permalink)  
Antiguo 20/08/2007, 13:33
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: Como puedo hacer lo siguiente

Bueno encontre lo de la UNION aca http://mysql.conclase.net/curso/index.php?sen=UNION

Es igual como me dijiste.

Otra cosa tenes idea como recorro todas las tablas con un prefijo.

(SELECT * FROM internet_*) UNION (SELECT * FROM multimedia_*) ORDER BY cal_user DESC

Donde internet_* = internet_navegadores, internet_mail, .....
Donde multimedia_* = multimedia_diseño, multimedia_musica, ...
  #7 (permalink)  
Antiguo 20/08/2007, 16:14
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Re: Como puedo hacer lo siguiente

No tenés que recorrer nada, no comprendo tu pregunta. Tal cual el ejemplo que te pase pone el nombre de tus tablas y agrega todas las tablas que quieras.

Lo único que tenés que tener en cuenta es que los datos que pidas tienen que se los mismos tipos de datos (collations).
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #8 (permalink)  
Antiguo 20/08/2007, 16:20
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: Como puedo hacer lo siguiente

Pero yo en la consulta tengo que poner las tablas.

Si dentro de mi base de datos tengo.

es_tabla1
es_tabla2
es_tabla3
.
.
es_tablaN-1
es_tablaN
fr_tabla4

y hago lo siguiente.

Código PHP:
(SELECT FROM es_tabla1UNION (SELECT FROM es_tabla2ORDER BY calificacion DESC 
Funciona joya, me las une a las tablas, pero ahora como tengo N tablas con el prefijo "es" quiero ordenar solo esas tablas y no incluir con las del prefijo "fr"
  #9 (permalink)  
Antiguo 20/08/2007, 17:04
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Re: Como puedo hacer lo siguiente

N tablas? o querrás decir X tablas?
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #10 (permalink)  
Antiguo 20/08/2007, 17:41
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: Como puedo hacer lo siguiente

Es lo mismo, es una variable para indicar que tengo un numero finito.

Última edición por dieguito01; 20/08/2007 a las 17:50
  #11 (permalink)  
Antiguo 20/08/2007, 19:00
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Re: Como puedo hacer lo siguiente

No es lo mismo acá n (que representa a un valor variable) a x (que es un número fijo).

Igual, si son fijas sigo sin entender, agregas las que quieras en los union, y si es dinámico (n) decí como conseguís acceder a ellas.

Código PHP:
(SELECT FROM es_tabla1)
 
UNION 
(SELECT FROM es_tabla2)
 
UNION 
(SELECT FROM es_tabla3)
 
UNION 
(SELECT FROM es_tabla4)
 
UNION 
(SELECT FROM es_tabla5)
 
UNION 
(SELECT FROM es_tabla6)
 
UNION 
(SELECT FROM es_tabla7)
 
UNION 
(SELECT FROM es_tabla8)
 
UNION 
(SELECT FROM es_tabla9)
 
UNION 
(SELECT FROM es_tabla10)
 
UNION 
(SELECT FROM es_tabla11)
 
UNION 
(SELECT FROM es_tabla12)
 
UNION 
(SELECT FROM es_tabla13)
 
UNION 
(SELECT FROM es_tabla14)
 
UNION 
(SELECT FROM es_tabla15)
 
ORDER BY calificacion DESC 
Notas el patrón? sino explicame mejor porque realmente no logro comprenderte.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #12 (permalink)  
Antiguo 20/08/2007, 19:37
 
Fecha de Ingreso: abril-2007
Mensajes: 77
Antigüedad: 17 años
Puntos: 0
Re: Como puedo hacer lo siguiente

Asi esta perfecto como hiciste vos el codigo. Pero si tengo 200 tablas con el prefijo "es_" y no quiero escribir las 200 uniones, como hago para indicar que seleccione todas las tablas con el prefijo "es_" y no con el prefijo "fr_"

SELECT * FROM es_* ORDER BY calificacion DESC; ???

Saludos
  #13 (permalink)  
Antiguo 20/08/2007, 19:57
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Como puedo hacer lo siguiente

Puedes primero hacer un query:
Código:
SHOW TABLES FROM `db` LIKE 'es_%'
Guardas todas las tablas en un array, y via un loop creas tu SQL para hacer tu UNION.

Saludos.

Última edición por GatorV; 20/08/2007 a las 20:27
  #14 (permalink)  
Antiguo 20/08/2007, 20:26
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Re: Como puedo hacer lo siguiente

Cita:
Ahora mi problema, no tengo 3 tablas, sino tengo como 20 tablas
Cita:
Pero si tengo 200 tablas con el prefijo "es_"
Tenés que ser más claro. Lo que dice GatorV esta bárbaro para si son 200 tablas, pero no para 20 tablas.

Igual ojo, un union de 200 tablas no te lo aconsejo, hace el cache que te comente anteriormente si o si.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #15 (permalink)  
Antiguo 20/08/2007, 20:38
 
Fecha de Ingreso: enero-2007
Ubicación: Buenos Aires, ARG
Mensajes: 71
Antigüedad: 17 años, 3 meses
Puntos: 2
Re: Como puedo hacer lo siguiente

Creo q lo q dice gatorV está bien, pero claro, tambien como dice nicolaspar, no es lo mismo 200 q 20!!!!

si no me confundí creo q el código sería:

$result = mysql_query( "SHOW TABLES FROM `db` LIKE 'es_%'", $db );
while($row = mysql_fetch_row($result)){
$sql .= "(SELECT * FROM $row[0]) UNION";
}

$all_result = mysql_query( substr( $sql, 0, strlen( $sql ) - 5 ) );

Creo q la ultima parte se puede mejorar seguro, xq está medio feito :-p ..jejej
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 04:20.