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

Consulta group_concat

Estas en el tema de Consulta group_concat en el foro de Mysql en Foros del Web. Hola, tengo una tabla que esta relacionada con otras 5 tablas con una relacion many to many y quiero mostrar en los campos e la ...
  #1 (permalink)  
Antiguo 04/04/2012, 08:59
 
Fecha de Ingreso: febrero-2010
Ubicación: La Habana,Cuba
Mensajes: 89
Antigüedad: 14 años, 2 meses
Puntos: 1
Consulta group_concat

Hola, tengo una tabla que esta relacionada con otras 5 tablas con una relacion many to many y quiero mostrar en los campos e la tabla principal los campos de las tablas adyacentes separados por comas; esto lo he logrado de la siguiente forma
Código:
select
	film.film_id,
	film.title,
	GROUP_CONCAT(distinct category.name SEPARATOR ',') as categoria,
	GROUP_CONCAT(distinct actor.fullname SEPARATOR ',') as actor
from 
	film
join film_category on film_category.film_id = film.film_id
join category on category.category_id = film_category.category_id
join film_actor on film_actor.film_id = film.film_id
join actor on actor.actor_id = film_actor.actor_id
group by film.film_id
Esta consulta realmente no me muestra los 999 registros de film sino solo 890 tardando 1 seg y 456 miliseg. Para mostrar todos los registros le agregao al join el left quedandome:
Código:
select
	film.film_id,
	film.title,
	GROUP_CONCAT(distinct category.name SEPARATOR ',') as categoria,
	GROUP_CONCAT(distinct actor.fullname SEPARATOR ',') as actor
from 
	film
left join film_category on film_category.film_id = film.film_id
left join category on category.category_id = film_category.category_id
left join film_actor on film_actor.film_id = film.film_id
left join actor on actor.actor_id = film_actor.actor_id
group by film.film_id
De esta forma me devuelve los 999 registros pero la consulta tarda 21 seg.
Estaba pensando en agregar las tablas adyacentes en la tabla principal, cosa que no me parece buena practica en el diseño de bases de datos y asi la consulta me demora 60 miliseg.
Entonces tengo el dilema de cambiar rendimiento por buenas practicas y quiciera que me recomendaran segun sus espericias que hacer pues varias personas se conectaran a mi bd con conexiones no muy buenas.
Bueno les agradezco de antemano.
  #2 (permalink)  
Antiguo 05/04/2012, 03:46
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta group_concat

Código MySQL:
Ver original
  1.     film.film_id,
  2.     film.title,
  3.     GROUP_CONCAT(distinct category.name SEPARATOR ',') as categoria,
  4.     GROUP_CONCAT(distinct actor.fullname SEPARATOR ',') as actor
  5.     (film
  6. left join (film_category inner join category on category.category_id = film_category.category_id)
  7.     on film_category.film_id = film.film_id)
  8. left join (film_actor INNER join actor on actor.actor_id = film_actor.actor_id)
  9.     on film_actor.film_id = film.film_id
  10. group by film.film_id

No se si ganaras algo....

La opción mejor quizás es ir a sql estándar olvidarse de group concat... y usar programación externa para mostrar las cosas como quieres.

Tienes films sin ninguna categoría ni actor... eso es lo que te fuerza a usar el Left Join... podrías solucionarlo....

Otro tema GROUP_CONCAT(distinct necesitas ese Distinct... una clave principal compuesta en las tablas film_category, film_actor te asegura que no habrá repeticiones y por tanto no necesitas ese distinct...

(la PK debe ser film_id+category_id y film_id+actor_id respectivamente)


Cualquier cosa antes de incurrir en esas malas practicas!!!!
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 05/04/2012 a las 04:06

Etiquetas: join, registros, select, tabla, campos
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 12:49.