Ver Mensaje Individual
  #11 (permalink)  
Antiguo 11/12/2011, 08:20
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: Problema con consulta

Bien, voy a mostrarte por qué te decía que esos dos ejemplos deberían dar el resultado que tu esperas.

Cree y cargue con datos cuatro tablas basadas en la descripción del primer post. Las tablas son:
Código MySQL:
Ver original
  1. DROP TABLE IF EXISTS `funciones`;
  2. CREATE TABLE  `funciones` (
  3.   `idioma` varchar(45) NOT NULL,
  4.   `sala` varchar(45) NOT NULL,
  5.   PRIMARY KEY  USING BTREE (`id`)
  6.  
  7. DROP TABLE IF EXISTS `pelicula`;
  8. CREATE TABLE  `pelicula` (
  9.   `titulo` varchar(45) NOT NULL,
  10.   PRIMARY KEY  USING BTREE (`id`)
  11.  
  12. DROP TABLE IF EXISTS `horarios`;
  13. CREATE TABLE  `horarios` (
  14.   `hora` time NOT NULL,
  15.   `funcion` int(10) unsigned NOT NULL,
  16.   PRIMARY KEY  USING BTREE (`id`),
  17.   KEY `FK_horarios_1` (`funcion`),
  18.   CONSTRAINT `FK_horarios_1` FOREIGN KEY (`funcion`) REFERENCES `funciones` (`id`)
  19.  
  20. DROP TABLE IF EXISTS `cartelera`;
  21. CREATE TABLE  `cartelera` (
  22.   `pelicula` int(10) unsigned NOT NULL,
  23.   `cine` int(10) unsigned NOT NULL,
  24.   `tipo_funcion` int(10) unsigned NOT NULL,
  25.   PRIMARY KEY  USING BTREE (`pelicula`,`tipo_funcion`,`cine`),
  26.   KEY `FK_cartelera_1` (`tipo_funcion`),
  27.   CONSTRAINT `FK_cartelera_1` FOREIGN KEY (`tipo_funcion`) REFERENCES `funciones` (`id`)

Sobre esta base, hice las dos consultas con sus resultados:
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     p.titulo,
  3.     ->     f.idioma,
  4.     ->     CONCAT('Sala ', f.sala) sala,
  5.     ->     CAST(GROUP_CONCAT(DISTINCT DATE_FORMAT(h.hora, '%k:%i') SEPARATOR ' - ') AS CHAR(200)) horarios
  6.     -> FROM
  7.     ->     cartelera c
  8.     ->     LEFT JOIN pelicula p ON c.pelicula = p.id
  9.     ->     LEFT JOIN funciones f ON c.tipo_funcion = f.id
  10.     ->     LEFT JOIN horarios h ON f.id = h.funcion
  11.     -> GROUP BY pelicula, idioma, sala;
  12. +--------------------+-------------+--------+---------------+
  13. | titulo             | idioma      | sala   | horarios      |
  14. +--------------------+-------------+--------+---------------+
  15. | Cars 2             | doblada     | Sala 1 | 14:30 - 19:30 |
  16. | Cars 2             | espa±ol     | Sala 3 | 16:30 - 19:00 |
  17. | Cars 2             | subtitulada | Sala 1 | 18:00 - 22:00 |
  18. | Cars 2             | subtitulada | Sala 2 | 16:00 - 19:00 |
  19. | Coraline           | doblada     | Sala 3 | 18:00         |
  20. | Coraline           | subtitulada | Sala 1 | 18:00 - 22:00 |
  21. | A±o Nuevo          | doblada     | Sala 1 | 14:30 - 19:30 |
  22. | A±o Nuevo          | subtitulada | Sala 2 | 19:00 - 16:00 |
  23. | Rapido y Furioso 5 | doblada     | Sala 3 | 18:00         |
  24. | Rapido y Furioso 5 | espa±ol     | Sala 3 | 19:00 - 16:30 |
  25. +--------------------+-------------+--------+---------------+
  26. 10 rows in set, 1 warning (0.00 sec)
  27.  
  28. mysql> SELECT
  29.     ->     p.titulo,
  30.     ->     f.idioma,
  31.     ->     CONCAT('Sala ', f.sala) sala,
  32.     ->     CAST(GROUP_CONCAT(DISTINCT DATE_FORMAT(h.hora, '%k:%i') SEPARATOR ' - ') AS CHAR(200)) horarios
  33.     -> FROM
  34.     ->     cartelera c
  35.     ->     INNER JOIN pelicula p ON c.pelicula = p.id
  36.     ->     LEFT JOIN funciones f ON c.tipo_funcion = f.id
  37.     ->     LEFT JOIN horarios h ON f.id = h.funcion
  38.     -> GROUP BY pelicula, idioma, f.sala;
  39. +--------------------+-------------+--------+---------------+
  40. | titulo             | idioma      | sala   | horarios      |
  41. +--------------------+-------------+--------+---------------+
  42. | Cars 2             | doblada     | Sala 1 | 14:30 - 19:30 |
  43. | Cars 2             | espa±ol     | Sala 3 | 19:00 - 16:30 |
  44. | Cars 2             | subtitulada | Sala 1 | 18:00 - 22:00 |
  45. | Cars 2             | subtitulada | Sala 2 | 16:00 - 19:00 |
  46. | Coraline           | doblada     | Sala 3 | 18:00         |
  47. | Coraline           | subtitulada | Sala 1 | 18:00 - 22:00 |
  48. | A±o Nuevo          | doblada     | Sala 1 | 14:30 - 19:30 |
  49. | A±o Nuevo          | subtitulada | Sala 2 | 16:00 - 19:00 |
  50. | Rapido y Furioso 5 | doblada     | Sala 3 | 18:00         |
  51. | Rapido y Furioso 5 | espa±ol     | Sala 3 | 19:00 - 16:30 |
  52. +--------------------+-------------+--------+---------------+
  53. 10 rows in set (0.00 sec)
Como podrás ver, las consultas efectivamente devuelven resultados como lo indicas. La diferencia esencia es que incluí algunas funciones de salida para evitar problemas con la representación de las columnas, porque GROUP_CONCAT() puede devolver un string o un BLOB dependiendo del conector usado y de la versión de MySQL.

Ahora bien: ¿Cuál es entonces el problema que se te presenta?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)