Foros del Web » Programando para Internet » PHP »

Una consulta a varias tablas a la vez

Estas en el tema de Una consulta a varias tablas a la vez en el foro de PHP en Foros del Web. Hola amigos, veran tengo un pequeño problema a ver si alguien puede echar una mano. Tengo la siguiente consulta a una base de datos: @import ...
  #1 (permalink)  
Antiguo 14/07/2014, 04:50
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 11 meses
Puntos: 5
Una consulta a varias tablas a la vez

Hola amigos, veran tengo un pequeño problema a ver si alguien puede echar una mano.

Tengo la siguiente consulta a una base de datos:

Código MySQL:
Ver original
  1. select id_curso, nombre_curso from * WHERE id_categoria_foranea = '$id_categoria_curso'



El asunto es que me gustaria que mostrara los campos:

id_curso y el nombre de curso que se hallen en 7 tablas diferentes donde se hayan estos campos.


Yo, en mi no saber, he construido la sentencia que os acabo de poner, poniendo * , intentando decir con ello que busque los campos en todas las tablas.

Pero evidentemente no funciona.


Suponiendo que las 7 tablas se llamasen:

tabla_1, tabla_2, tabla_3 ....... tabla_7


Podria decirme alguien como construir la sentencia de manera correcta.

Agradeceria que me pusieran un ejemplo con 3 primeras tablas, asi podria seguir yo hasta las 7 que serian .

es lo unico que me falta por terminar de todo el codigo que llevo entre manos.

gracias de antemano.

Última edición por gnzsoloyo; 14/07/2014 a las 06:25 Razón: Código PHP no permitido en foros de BBDD.
  #2 (permalink)  
Antiguo 14/07/2014, 06:24
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, 4 meses
Puntos: 2658
Respuesta: Una consulta a varias tablas a la vez

Hola.

Este tema es básicamente una derivación de otro, en el que ya tratamos contigo el defecto de diseño de usar siete (7) tablas para cursos que deberían manejarse con otro modelado (ver thread).
En ese thread, @quimfv te dio una solución de diseño sobre la que dijiste que te aclaraba el panorama (ver post).
Por lo que veo en este nuevo thread, has decidido no modificar esa estructura inconveniente, y quieres solucionar la query basado en ese modelo, del que ya te dijimos era defectuoso. Bueno, es tu derecho.
Pero como te comenté en ese momento:
Cita:
(...) siendo tablas diferentes, sin relaciones definidas por dependencia funcional, no hay modo de evitar tener que hacer siete (7) procesos para verificar cada una, y eventualmente realizar otros tantos UPDATEs. No al menos con un diseño de datos como el que nos estás describiendo.
Esto se extiende al caso de consultar las tablas, ya quee es imposible hacer un JOIN para buscar los datos que deseas obtener. Un JOIN sólo aplica a relaciones donde cada entidad representa un objeto diferente del sistema, y las tablas del curso no lo son. Tablas para cada curso es confundir las instancias de entidad con la entidad, que sería lo mismo que confundir los objetos con la clase (hablando programáticamente).

En este caso, la única forma de obtener las mismas columnas de datos, de diferentes tablas es usar UNION, no JOIN:
Código MySQL:
Ver original
  1. SELECT id_curso, nombre_curso
  2. FROM curso1
  3. WHERE id_categoria_foranea = '$id_categoria_curso'
  4. SELECT id_curso, nombre_curso
  5. FROM curso2
  6. WHERE id_categoria_foranea = '$id_categoria_curso'
  7. SELECT id_curso, nombre_curso
  8. FROM curso3
  9. WHERE id_categoria_foranea = '$id_categoria_curso'
  10. ...
Estoy usando UNION ALL y no sólo UNION para prevenir que haya dos cursos de igual ID, con el mismo nombre, pero pertenecientes a diferentes tablas. Si estás seguro que no se da esa posibilidad, usa sólo UNION:
Código MySQL:
Ver original
  1. SELECT id_curso, nombre_curso
  2. FROM curso1
  3. WHERE id_categoria_foranea = '$id_categoria_curso'
  4. SELECT id_curso, nombre_curso
  5. FROM curso2
  6. WHERE id_categoria_foranea = '$id_categoria_curso'
  7. SELECT id_curso, nombre_curso
  8. FROM curso3
  9. WHERE id_categoria_foranea = '$id_categoria_curso'
  10. ...
Obviamente, UNION no te dará a qué tabla pertenece, sólo te devolverá resultados encolumnados. Para hacer que puedas diferenciar la tabla, deberás crear una columna ficticia que pueda decirte a qué tabla pertenece cada registro:

Código MySQL:
Ver original
  1. SELECT id_curso, nombre_curso, 'Curso 1' Curso
  2. FROM curso1
  3. WHERE id_categoria_foranea = '$id_categoria_curso'
  4. SELECT id_curso, nombre_curso, 'Curso 2' Curso
  5. FROM curso2
  6. WHERE id_categoria_foranea = '$id_categoria_curso'
  7. SELECT id_curso, nombre_curso, 'Curso 3' Curso
  8. FROM curso3
  9. WHERE id_categoria_foranea = '$id_categoria_curso'
  10. ...

Esto implica que deberás adicionar un UNION y subsiguiente SELECT por cada tabla que agregues.
Si hubieses corregido tu modelo, esto se resolvería con dos o tres tablas con JOIN... pro, bueno, son las consecuencias de los modelos mal diseñados. No te lo puedo decir de otro modo.

Cuéntanos que tal te funcione.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 14/07/2014, 08:01
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 11 meses
Puntos: 5
Respuesta: Una consulta a varias tablas a la vez

Hola gnzsoloyo, vamos a ver;

Si, efectivamente esto que he puesto deriva de otro post mio anterior.

Seria absurdo que habiendomelo explicado por parte de quimfv (muy bien por cierto), insistiera sin una razon logica en seguir haciendolo de la manera digamos no incorrecta sino menos correcta.


Pero hay una razon para seguir haciendolo de la forma que lo estoy haciendo y por desgracia muy a mi pesar, y es la falta de tiempo ya que voy a contrareloj.

Y tardaria mucho en mi caso ya que hay mas partes implicadas que derivan de esta parte posteada que tendria que cambiar tambien.

Bien dicho esto te/ os cuento:

Ya he dado con una solucion que aunque quizas no la mas elegante, si funciona pefectamente:

Código SQL:
Ver original
  1. $res_1=mysql_query("select id_curso, nombre_curso from tabla_1WHERE id_categoria_foranea = '$id_categoria_curso'",$link);
  2.  
  3.  
  4.     $res_1=mysql_query("select id_curso, nombre_curso from tabla_2 WHERE id_categoria_foranea = '$id_categoria_curso'",$link);
  5. .
  6. .
  7. .
  8.  
  9.     $res_1=mysql_query("select id_curso, nombre_curso from tabla_7WHERE id_categoria_foranea = '$id_categoria_curso'",$link);


Posteriormente a esto debo mostrar los resultados dentro de un combobox asi:

Código PHP:
Ver original
  1. <?php
  2.    
  3.     while (
  4.         ($fila=mysql_fetch_array($res_1)) or
  5.         ($fila=mysql_fetch_array($res_2)) or
  6.         ($fila=mysql_fetch_array($res_3)) or
  7.         ($fila=mysql_fetch_array($res_4)) or
  8.         ($fila=mysql_fetch_array($res_5)) or
  9.         ($fila=mysql_fetch_array($res_6)) or
  10.         ($fila=mysql_fetch_array($res_7))
  11.     ) {
  12.    
  13.     ?>
  14.    
  15.      <option><?php echo $fila['nombre_curso']; ?></option>
  16.      
  17.     <?php } ?>


Y funciona cual reloj suizo.


Posdata: podeis estar seguros que la proxima vez lo optimizare como me comentasteis desde el principio y ya con mas tiempo.

¿Sino para que iba a molestarme en preguntar nada en este foro?

Un saludo.
  #4 (permalink)  
Antiguo 14/07/2014, 08:15
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, 4 meses
Puntos: 2658
Respuesta: Una consulta a varias tablas a la vez

La solución que planteas es por programación. Programación es OFF TOPIC en los foros de Bases de Datos (leer las normas del Foro de Bases de Datos).

Movido a foro de PHP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 14/07/2014, 08:33
 
Fecha de Ingreso: mayo-2012
Mensajes: 760
Antigüedad: 11 años, 11 meses
Puntos: 5
Respuesta: Una consulta a varias tablas a la vez

Respetable es que una solucion por programacion, sea como dices OFF TOPIC.

Pero a parte de no haberme ni tan siquiera decirme que te parece la solucion que he propuesto.

¿Me puedes decir como puedo enseñarte mi propuesta de solucion al problema via programacion?


Ya que es la unica forma que he podido solucionar el problema y queria compartirla.


Que deberia haber hecho escribir la solucion en el foro de programacion y decir al aire:

eh gnzsoloyo alla donde te encuentres , aqui te he puesto una propuesta de solucion al problema via programacion.


Dicho de otro modo¿ para tratar un mismo problema tengo que escribir en dos foros?
  #6 (permalink)  
Antiguo 14/07/2014, 08:48
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, 4 meses
Puntos: 2658
Respuesta: Una consulta a varias tablas a la vez

Cita:
Dicho de otro modo¿ para tratar un mismo problema tengo que escribir en dos foros?
No. Las Políticas de Uso de Foros del Web dicen explícitamente que no se permite abrir el mismo tema en dos foros diferentes (PDU 2.4), así como que los threads se podrán mover sin previo aviso (PDU 2.1).

Respecto al foro de Bases de Datos, las normas de ese foro dicen explícitamente que no se tratan temas de programación Sólo SQL y gestion de BBDD. Por eso he debido mover el post a este foro.
Cita:
Pero a parte de no haberme ni tan siquiera decirme que te parece la solucion que he propuesto.
Yo ya te dije, desde mi óptica, cuál sería la solución en SQL para el problema que planteaste, y que puedes leer más arriba. Tengo la impresión de que no la has le´ñido y/o probado.
Implementalo, prueba 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)

Última edición por gnzsoloyo; 14/07/2014 a las 10:14

Etiquetas: campo, mysql, select, sql, tabla, tablas, vez
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:43.