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

Consulta SQL con varios referencias a otra tabla.

Estas en el tema de Consulta SQL con varios referencias a otra tabla. en el foro de Mysql en Foros del Web. Hola gente, tengo un problemilla con SQL que no se como solucionar. Tengo una tabla que tiene 4 campos con un id de un dj, ...
  #1 (permalink)  
Antiguo 25/12/2014, 15:09
VityOsma
Invitado
 
Mensajes: n/a
Puntos:
Consulta SQL con varios referencias a otra tabla.

Hola gente, tengo un problemilla con SQL que no se como solucionar.

Tengo una tabla que tiene 4 campos con un id de un dj, en la tabla de djs tengo el nombre de cada uno y necesito una consulta que me devuelva el nombre de cada dj en cada una de las columnas (dj1,dj2,dj3,dj4).

En las siguientes consultas podéis ver los campos de cada tabla.
Código SQL:
Ver original
  1. SELECT id,name FROM channeldjs;
Código SQL:
Ver original
  1. SELECT id,dj1,dj2,dj3,dj4 FROM channelsongs;

He empezado creando esta consulta, pero no se como poner los filtros para que cada id se sustituya por el nombre del artista con esa id.

Código SQL:
Ver original
  1. SELECT cs.name,cd.name AS dj1,cd.name AS dj2,cd.name AS dj3,cd.name AS dj4,TIME,cs.points
  2.     FROM channelsongs AS cs,channeldjs AS cd
  3.     WHERE cd.id=cs.dj1

Última edición por gnzsoloyo; 25/12/2014 a las 17:16
  #2 (permalink)  
Antiguo 27/12/2014, 10:26
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: Consulta SQL con varios referencias a otra tabla.

En realidad, estimado, tienes dos problemas...
Tu consulta, sobre la base de esa tabla, no es imposible, pero si es complicada e ineficiente. Necesitas invocar la tabla que contiene los nombres cuatro veces, una por cada uno de los ID de cada uno de los campos. Eso hace que la consulta requiera hacer cuatro veces los JOIN, con el consiguiente exceso en el acceso a tablas e índices, y eso es lo que la hace muy ineficiente.
Código MySQL:
Ver original
  1.     cs.name,
  2.     cd.name dj1,
  3.     cd.name dj2,
  4.     cd.name dj3,
  5.     cd.name dj4,
  6.     TIME,
  7.     cs.points
  8. FROM channelsongs cs
  9.     INNER JOIN channeldjs cd1 ON cd1.id=cs.dj1
  10.     INNER JOIN channeldjs cd2 ON cd2.id=cs.dj2
  11.     INNER JOIN channeldjs cd3 ON cd3.id=cs.dj3
  12.     INNER JOIN channeldjs cd4 ON cd4.id=cs.dj4
  13. GROUP BY cs.name
Pero el primer problema, y central, es que esa tabla de canales está muy mal diseñada. Esa tabla expresa una relación N:M entre dos entidades: Canales y DJs, y toda relación de ese tipo genera una tabla relaciona, que tu estás diseñando muy mal.
La tabla debería tener un registro por cada uno de los DJs asociados a un canal dado, más un discriminante de orden. Un diseño correcto así podría darte la oportunidad de incluir más de cuatro DJs sin necesidad de reformar las tabla y el JOIN sólo requeriría hacer un único INNER JOIN... y no cuatro.
Adicionalmente, el mostrar los cuatro en un único registro pasaría a ser un tema de programación y liberarías a la base de una tarea ineficiente.
__________________
¿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 29/12/2014, 14:21
VityOsma
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Consulta SQL con varios referencias a otra tabla.

Gracias por la respuesta.

Que la tabla estaba mal diseñada ya lo sabia, pero no pensé que seria necesario utilizar 4 join para hacer la consulta, ya conseguí hacer una consulta similar a la que me propones y tardaba 11 segundos teniendo la tabla unos 200 registros , así que fue un desastre.

Al final he optado por poner los nombres de los DJs en la tabla (o generar otra tabla paralela) en vez de su ID y utilizar una consulta simple, la otra opción sería crea una tabla intermedia con iddj->idcancion, pero no me convencía mucho.

Lo que me comentas sobre:
La tabla debería tener un registro por cada uno de los DJs asociados a un canal dado, más un discriminante de orden.

Ya tengo cada DJ asociado a su canal, aunque se repita un dj se añade otro registro con el mismo dj y otro canal por que cada uno lo puede llamar de formas diferentes o utilizar distintas imágenes, pero eso no soluciona el problema de los djs y las canciones no? se te ocurre alguna solución mejor que crear una tabla intermedia o generar una tabla con los nombres directamente?

Gracias, un saludo.

Etiquetas: Ninguno
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 16:45.