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

Cuál consulta es más eficiente?

Estas en el tema de Cuál consulta es más eficiente? en el foro de Mysql en Foros del Web. Hola, hace un tiempo estoy metido en un lío con una web que estoy desarrollando, en la cual voy a implementar un sistema de categorías ...
  #1 (permalink)  
Antiguo 13/09/2009, 09:16
 
Fecha de Ingreso: diciembre-2007
Ubicación: Rosario
Mensajes: 65
Antigüedad: 16 años, 4 meses
Puntos: 2
Cuál consulta es más eficiente?

Hola, hace un tiempo estoy metido en un lío con una web que estoy desarrollando, en la cual voy a implementar un sistema de categorías en la cual puedo asignar varios objetos a una categoría y varias categorías a un mismo objeto, esta es la parte complicada (para mi por lo menos), por eso tuve que utilizar 3 tablas.

Una tabla para las categorias, otra para los objetos y otra que contenga las correspondientes relaciones.

El problema me surge cuando quiero ver los objetos de una determinada categoria, tengo hechas dos consultas distintas que, aparentemente, devuelven lo mismo, pero son muy distintas, supongo que una es mas eficiente que la otra, quisiera saber si me pueden decir cuál es.

Los objetos que mencioné son programas.

Código:
"select pro.titulo as nombre, relacion.catTitulo as catTitulo, relacion.catNicename as catNicename, pro.nicename as nicename, pro.descrCorta as descrCorta, pro.licencia as licencia from
   (select cat.titulo as catTitulo, cat.nicename as catNicename, rel.idPrograma as proId from
      (select idPrograma, idCategoria from $tablaRelacion where idCategoria = [id de la categoria]) as rel
   join
   $tablaCategorias as cat
   where rel.idCategoria = cat.idCat) as relacion
join
$tablaProgramas as pro
where relacion.proId = pro.idPrograma;"
Código:
"SELECT pro.titulo as nombre, cat.titulo as catTitulo, cat.nicename as catNicename, pro.nicename as nicename, pro.descrCorta as descrCorta, pro.licencia as licencia FROM $tablaRelacion as rel, $tablaProgramas as pro, $tablaCategorias as cat
WHERE rel.idCategoria = cat.idCat
AND cat.idCat = [id de la categoria]
AND pro.idPrograma = rel.idPrograma
GROUP BY pro.idPrograma;"
Creo que no hace falta que les explique las diferencias, en el 1er caso fui creando tablas "auxiliares" y las fui uniendo; en la segunda (la cual la encontre en internet), aparentemente lo que hace es un join entre 3 tablas (si no me equivoco) y luego pone las condiciones. La 2da opción parece más elegante, pero imagino que carga bastante al servidor, qué les parece?

Conocen alguna forma más eficiente de hacer esto?

Muchas gracias

Última edición por luciano_che; 13/09/2009 a las 09:34
  #2 (permalink)  
Antiguo 14/09/2009, 00:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Cuál consulta es más eficiente?

Código sql:
Ver original
  1. SELECT pro.titulo AS nombre,
  2.                cat.titulo AS catTitulo,
  3.                cat.nicename AS catNicename,
  4.                pro.nicename AS nicename,
  5.                pro.descrCorta AS descrCorta,
  6.                pro.licencia AS licencia
  7. FROM $tablaCategorias AS cat
  8.             LEFT JOIN $tablaRelacion AS rel
  9.                    ON cat.idCat = rel.idCategoria
  10.             LEFT JOIN $tablaProgramas AS pro
  11.                   ON pro.idPrograma = rel.idPrograma
  12. WHERE cat.idCat = [id de la categoria]
  13. ORDER BY pro.titulo;

Si el motor que usas te lo permite esta seria mejor....

Un indice sobre idCat i idCategoria ayudaria....

GROUP BY pro.idPrograma;

No tienes ninguna función de agregación luego el group by no tiene sentido en todo caso order by por si te interesa ordenar por los programas, pero claro por el nombre no el id



Quim
  #3 (permalink)  
Antiguo 14/09/2009, 12:44
 
Fecha de Ingreso: diciembre-2007
Ubicación: Rosario
Mensajes: 65
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: Cuál consulta es más eficiente?

Muchas gracias, quimfv, voy a probar como me decís vos.

El group by lo había puesto para evitar que me aparezca algún programa dos veces si erróneamente un programa está en una categoría y además en su categoría superior.

El código que me pasaste vos deja abierta la posibilidad de que un programa aparezca dos veces?

Saludos y gracias de nuevo
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 01:47.