Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] primera consulta en SQL

Estas en el tema de primera consulta en SQL en el foro de Mysql en Foros del Web. Hola, Estoy haciendo un ejercicio que consiste en que la condicción afecta a dos tablas. Lo hago asi por separado y anda bien; pero no ...
  #1 (permalink)  
Antiguo 13/11/2012, 11:55
Avatar de fpalomar  
Fecha de Ingreso: noviembre-2003
Mensajes: 123
Antigüedad: 20 años, 5 meses
Puntos: 3
primera consulta en SQL

Hola,

Estoy haciendo un ejercicio que consiste en que la condicción afecta a dos tablas. Lo hago asi por separado y anda bien; pero no se como se hace para ponerlo junto.

Se trata de un conservatorio, esta la tabla conciertos, aula_clasica y aula_teatro. He de averiguar los directores de conciertos que tambien dan clase en el aula_clasica(de musica clasica) y/o en el aula_teatro(musica para el teatro)

SELECT codigo_director
FROM conciertos
WHERE] codigo_director IN (SELECT codigo FROM aula_clasica)

SELECT codigo_director
FROM conciertos
WHERE] codigo_director IN (SELECT codigo FROM aula_teatro)

gracias por la ayuda
  #2 (permalink)  
Antiguo 13/11/2012, 12:35
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: primera consulta en SQL

Prueba a unir las tablas con un INNER JOIN
  #3 (permalink)  
Antiguo 13/11/2012, 15:55
Avatar de zeliq  
Fecha de Ingreso: noviembre-2012
Ubicación: Barcelona
Mensajes: 17
Antigüedad: 11 años, 6 meses
Puntos: 3
Respuesta: primera consulta en SQL

Hay que poner dos condiciones al WHERE con un AND:
Código SQL:
Ver original
  1. SELECT codigo_director
  2. FROM conciertos
  3. WHERE codigo_director IN (SELECT codigo FROM aula_clasica)
  4. AND codigo_director IN (SELECT codigo FROM aula_teatro)
  #4 (permalink)  
Antiguo 13/11/2012, 19:59
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, 5 meses
Puntos: 2658
Respuesta: primera consulta en SQL

Cita:
Se trata de un conservatorio, esta la tabla conciertos, aula_clasica y aula_teatro. He de averiguar los directores de conciertos que tambien dan clase en el aula_clasica(de musica clasica) y/o en el aula_teatro(musica para el teatro)
Este ejercicio no se puede resolver correctamente con tres tablas.
Requeriría al menos:
- Director
- Aula (Entidad padre)
- Aula_Clásica (Entidad Hija)
- Aula_Teatro (Entidad Hija)
- Clase (Relacional con Director y Aula).
Sin al menos esos elementos la consulta realizada con tres tablas generará un producto cartesiano.

@zeliq: No puedes plantear que un mismo campo pueda tener al mismo tiempo dos valores diferentes. Eso es lógicamente imposible.
Esto no devuelve registros:
Código MySQL:
Ver original
  1. codigo_director IN (SELECT codigo FROM aula_clasica)
  2. codigo_director IN (SELECT codigo FROM aula_teatro)
__________________
¿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/11/2012, 16:01
Avatar de zeliq  
Fecha de Ingreso: noviembre-2012
Ubicación: Barcelona
Mensajes: 17
Antigüedad: 11 años, 6 meses
Puntos: 3
Respuesta: primera consulta en SQL

A mí esto me funciona:

Código MySQL:
Ver original
  1. mysql> select * from concierto;
  2. +-------------+-----------------+-----------------+
  3. | idconcierto | nombreConcierto | codigo_director |
  4. +-------------+-----------------+-----------------+
  5. |           1 | Bach            |               1 |
  6. |           2 | Beethoven       |               2 |
  7. |           3 | Mozart          |               1 |
  8. |           4 | Bartok          |               3 |
  9. +-------------+-----------------+-----------------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> select * from aula_clasica;
  13. +----+--------+
  14. | id | codigo |
  15. +----+--------+
  16. |  1 |      1 |
  17. |  2 |      2 |
  18. +----+--------+
  19. 2 rows in set (0.00 sec)
  20.  
  21. mysql> select * from aula_teatro;
  22. +----+--------+
  23. | id | codigo |
  24. +----+--------+
  25. |  1 |      3 |
  26. |  2 |      4 |
  27. |  3 |      1 |
  28. +----+--------+
  29. 3 rows in set (0.00 sec)
  30.  
  31. mysql> SELECT codigo_director
  32.     -> FROM concierto
  33.     -> WHERE codigo_director IN (SELECT codigo FROM aula_clasica)
  34.     -> AND codigo_director IN (SELECT codigo FROM aula_teatro);
  35. +-----------------+
  36. | codigo_director |
  37. +-----------------+
  38. |               1 |
  39. |               1 |
  40. +-----------------+
  41. 2 rows in set (0.00 sec)

Otra cosa es que:
- Para que codigo_director no tenga repetidos en la consulta habría que añadir un GROUP BY o un DISTINCT
- Se supone que existe una tabla de directores
- Las tablas aula_clasica y aula_teatro parecen tablas de relación varios a varios (y no tienen mucho sentido si no hay más campos que los que yo he puesto)
- Es un error de diseño, seguramente grave, llamar codigo al campo que contiene el código de director en las tablas aula_clasica y aula_teatro

Pero funcionar, funciona.
  #6 (permalink)  
Antiguo 14/11/2012, 16:57
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, 5 meses
Puntos: 2658
Respuesta: primera consulta en SQL

Eso te está funcionando porque en realidad tienes ID iguales en tablas diferentes, pero en un caso es el aula 1 de teatro y en el otro es el aula 1 de clásica... Son cosas lógicamente diferentes.
Si dos aulas no representan el mismo espacio físico, entonces no pueden tener el mismo ID. En ese caso lo que tienes es una entidad fuerte padre Aula y dos entidades débiles hijas Aula_Clasica y Aula_Teatro, cada una de las cuales hereda la PK de Aula, pero no se pueden superponer los valores de ID entre ambas.
¿Se entiende?
Eso es lo que se denomina "herencia", y es un caso especial del modelo E-R extendido.

Ahora bien, si es la misma aula física, dedicada a dos cosas diferentes, entonces lo que tienes es una sola entidad Aula con otra entidad ClasesDe, relacionada con Asignatura, Aula y Director. Y en ese contexto, lo que propones está mal planteado porque no cumple con la consistencia necesaria.

Lo que no puedes planear es que una misma FK apunte a dos tablas diferentes. Si propones eso, reprobarás Base de Datos I, sin que el profesor tenga necesidad de seguir mirando el examen.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 17/11/2012, 03:04
Avatar de fpalomar  
Fecha de Ingreso: noviembre-2003
Mensajes: 123
Antigüedad: 20 años, 5 meses
Puntos: 3
Respuesta: primera consulta en SQL

Hola,

Gracias por aclararmelo.

Saludos

Etiquetas: primera, select, sql, tabla
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 08:11.