Ver Mensaje Individual
  #2 (permalink)  
Antiguo 14/07/2014, 06:24
Avatar de gnzsoloyo
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, 5 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)