SQL - Duda en consulta a 3 tablas

 
Vista:

Duda en consulta a 3 tablas

Publicado por Alfonso (5 intervenciones) el 01/02/2007 20:30:48
Hola!

Perdonad si me he expandido demasiado explicando. Tengo 3 tablas, cuyos campos son, resumiendo:

----------
conciertos
----------
id_concierto
titular
descripción

----------
citas
----------
id_cita
fecha

----------
conciertos_citas
----------
id_concierto
id_cita

Un concierto puede tener muchas citas, y a su vez, una cita puede hacer referencia a muchos conciertos, por eso la estructura la hice así:

conciertos(id_concierto) --> conciertos_citas <-- citas(id_cita)

La tabla que establece la relación entre citas y conciertos, es "conciertos_citas".

El cliente me pide un listado de conciertos del mes de noviembre, ordenados cronológicamente según la fecha de su primera cita.

Lo que necesito por tanto, es hacer un listado de los titulares de conciertos, ordenados por la fecha de la cita que tengan asociada. Quedaría así:

Titular concierto 1
Fechas: 10 de nov, 12 de nov y 23 de nov -> este concierto debe aparecer el primero porque su primera cita es el 10 de nov, que es la menor de cualquiera de las citas de los otros conciertos.

Titular concierto 2
Fechas: 11 de nov, 12 de nov y 16 de nov -> este concierto es el segundo del listado porque su primera cita, el 11 de nov, mayor que la primera cita del primer concierto (10 de nov)

Titular concierto 3
Fechas: 15 de nov, 21 de nov y 22 de nov -> su primera cita es el 15 de nov, por lo que iría en tercera posición.

Pero hasta ahora lo único que he conseguido es que se muestre el listado de conciertos, pero desordenado cronológicamente:

Titular concierto 3
Fechas: 15 de nov, 21 de nov y 22 de nov

Titular concierto 1
Fechas: 10 de nov, 12 de nov y 23 de nov

Titular concierto 2
Fechas: 11 de nov, 12 de nov y 16 de nov

Esto lo he conseguido con la siguiente sentencia SQL:

SELECT * FROM conciertos
WHERE EXISTS (
SELECT * FROM conciertos_citas
WHERE conciertos_citas.id_concierto = conciertos.id_concierto
GROUP BY conciertos_citas.id_concierto
)

¿Cómo puedo hacer para que el listado de conciertos se me ordene según la fecha de sus citas?

Uso SQL Server. Me hacéis un mundo si alguien supiera contestarme. Muchas gracias y un saludo,
Alfonso.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Duda en consulta a 3 tablas

Publicado por Isaías (5072 intervenciones) el 01/02/2007 21:05:38
select citas.id_cita, conciertos.* from conciertos
join conciertos_citas on conciertos.id_concierto = conciertos_citas.id_concierto
join citas on citas.id_cita = conciertos_citas.id_cita
WHERE MONTH(citas.fecha) = 11
ORDER BY 1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda en consulta a 3 tablas

Publicado por Alfonso (5 intervenciones) el 01/02/2007 22:24:24
Gracias Isaías por contestar. Lo que me has pasado, me devolvia una lista con un concierto por cada cita en la agenda, y desordenados cronológicamente. Así que cambie el ORDER BY del final, y puse ORDER BY citas.fecha ASC:

SELECT DISTINCT citas.fecha, conciertos.* FROM conciertos
JOIN conciertos_citas ON conciertos.id_concierto = conciertos_citas.id_concierto
JOIN citas ON citas.id_cita = conciertos_citas.id_cita
WHERE MONTH(citas.fecha) = 11
ORDER BY citas.fecha ASC

Ahora lo que me devuelve es un concierto para cada cita, pero al fin ordenados cronológicamente. Lo que necesitaría es que, si un concierto tiene 4 citas, no apareciese 4 veces en el listado.

Para ello intenté poner SELECT DISTINCT, pero por lo visto no funciona con campos ntext. También traté de usar un GROUP BY conciertos.id_concierto, pero me daba error.

¿Alguna idea?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda en consulta a 3 tablas

Publicado por Alfonso (5 intervenciones) el 01/02/2007 22:41:30
Debería quedar algo así:

Concierto 1
Fechas: 01 enero, 10 de enero y 20 de enero

Concierto 2.
Fechas: 06 de enero, 07 de enero, 08 de enero

Concierto 3.
Fechas: 07 de enero y 30 de enero
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda en consulta a 3 tablas

Publicado por Isaías (5072 intervenciones) el 02/02/2007 19:01:17
Alfonso

SQL SERVER como cualquier otro manejador de base de datos, es EXCELENTE para el manejo de grandes cantidad de datos, pero muy malo, para intentar "FORMATEAR" su salida.

Esto, deberias resolverlo en la primera capa (front).

En cuanto a tu columna de tipo NTEXT, ¿podrias decirme cual es?

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda en consulta a 3 tablas

Publicado por Alfonso (5 intervenciones) el 03/02/2007 13:46:49
Hola Ismael, te cuento lo que he conseguido desde mi último mensaje:

He creado una vista llamada citas_conciertos:

CREATE VIEW citas_conciertos AS
SELECT DISTINCT TOP 100 PERCENT co.id_concierto, ci.fecha
FROM conciertos AS co
INNER JOIN conciertos_citas AS cc ON co.id_concierto = cc.id_concierto
INNER JOIN citas AS ci ON ci.id_cita = cc.id_cita
ORDER BY ci.fecha

Con esto lo que consigo es una tabla de la siguiente manera:

id_concierto | fecha
-----------------------------------------
001 20070201
001 20070202
001 20070203
002 20070207
002 20070208
003 20070214
..... .....

Efectivamente los conciertos los ordena según la fecha de sus citas, pero claro, en el listado obtengo por triplicado una id_concierto, en el caso de que dicho concierto tenga 3 citas.

Entonces luego lanzo esta consulta desde asp:

SELECT co.id_concierto, co.id_serie, co.id_ciclo, co.comentario, co.numero, co.titular
FROM conciertos co
WHERE co.id_concierto IN (
SELECT DISTINCT cc2.id_concierto
FROM citas_conciertos cc2
INNER JOIN conciertos co2 ON co2.id_concierto = cc2.id_concierto
WHERE (cc2.fecha>='una fecha' AND cc2.fecha<='otra fecha')
)

Lo que consigo es un listado en el que por fin los conciertos no aparecen por triplicado si tienen 3 citas, pero aparecen desordenados cronológicamente.

Dándole vueltas llegué a la conclusión de que en principio, me valdría con recuperar un listado con sólamente los id_concierto que tuvieran cita en, por ejemplo, noviembre, ordenados según la fecha de su primera cita. Según el resultado de la vista anterior, me quedaría algo así:

id_concierto | fecha
-----------------------------------------
001 20070201
002 20070207
003 20070214
..... .....

Después, haría un "select * from citas where id_concierto = .... AND fecha = ... ORDER BY fecha" (más o menos), para averiguar ya el resto de las citas que esa id_concierto tiene asociadas en ese rango de fechas.

Respondiendo a tu pregunta, el campo que tiene el tipo de datos NTEXT es conciertos.comentario.

Creo que el problema lo tengo en la vista. ¿Cómo tendría que hacer la vista para que sólo me saliera una única id_concierto? El resultado debería ser:

id_concierto fecha
-----------------------------------------
001 20070201
002 20070207
003 20070214
..... .....

En vez de:

id_concierto fecha
-----------------------------------------
001 20070201
001 20070202
001 20070203
002 20070207
002 20070208
003 20070214
..... .....

La sentencia con la que construyo la vista actual tiene:

SELECT DISTINCT TOP 100 PERCENT co.id_concierto, ci.fecha........

Pero el DISTINCT no lo está haciendo...

Gracias nuevamente,
Un saludo,
Alfonso.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda en consulta a 3 tablas

Publicado por Isaías (5072 intervenciones) el 06/02/2007 20:29:03
El DISTINCT si lo esta haciendo, puesto que NO tienes registros duplicados, cambian en la fecha, puedes utilizar MIN(FECHA) o MAX(FECHA), con un GROUP BY id_concierto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar