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

Ayudita con un query

Estas en el tema de Ayudita con un query en el foro de Mysql en Foros del Web. Hola amigos, ante todo un saludo. Dentro de la estructura de datos de mi proyecto tengo las siguientes tablas: datagroups - iddatagroup, int - datagroup, ...
  #1 (permalink)  
Antiguo 18/11/2010, 10:51
 
Fecha de Ingreso: noviembre-2001
Ubicación: México DF
Mensajes: 128
Antigüedad: 22 años, 4 meses
Puntos: 0
Pregunta Ayudita con un query

Hola amigos, ante todo un saludo.

Dentro de la estructura de datos de mi proyecto tengo las siguientes tablas:

datagroups
- iddatagroup, int
- datagroup, varchar(50)
- year, int

data
- iddata, int
- value, float
- datagroupid, int
- categoryid, int

categories
- idcategory, int
- category, varchar(30)
- code, varchar(5)

Un "datagroup" tiene muchos "data" y cada "data" pertenece a una "category".

En un formulario se muestra una lista de checkboxes, cada uno de los cuales devuelve una categoría, por lo que al hacer el submit tengo la lista de las categorías que quiere el cliente.

¿Cómo hacer un select que cargue la información sólo de las categorías seleccionadas?

Actualmente tengo esto, pero es muy lento cuando selecciono más de 10 categorías:
Código PHP:
for ($i 0$i $total_cat$i++) {
     if (
$i != 0
          
$tmpSQL .= " UNION ";
     
$tmpSQL .= "(SELECT * FROM `datagroups` dg
          LEFT JOIN `datas` d ON d.`datagroupid` = dg.`iddatagroup`
          LEFT JOIN `categories` c ON c.`idcategory` = d.`categoryid`"
;
          
WHERE c.`code` = '" . trim($_POST['codecat_' . $i]) . "')";
}
$tmpSQL .= " 
ORDER BY `iddatagroup`,`idcategory`"; 
Quisiera lograr el mismo resultado, pero sin usar "UNION".
Alguna sugerencia?

Saludos!!!!
__________________
Nuedi Servicios SA de CV
http://www.nuedi.mx
  #2 (permalink)  
Antiguo 19/11/2010, 07:49
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años
Puntos: 574
Respuesta: Ayudita con un query

IN seria una opción

WHERE c.`code` IN ();

en el parentesis pones el contenido de $_POST['codecat_X'] se parados por comas

codecat_1,codecat_2,....

el mismo bucle que te sirve para construir las distintas SELECT pero solo para construir el string separado por comas ....


Deberia quedar algo así:

Código PHP:
Ver original
  1. $tmpSQL = "SELECT * FROM `datagroups` dg "
  2.          ."LEFT JOIN `datas` d ON d.`datagroupid` = dg.`iddatagroup` "
  3.          ."LEFT JOIN `categories` c ON c.`idcategory` = d.`categoryid` "
  4.          ."WHERE c.`code` IN (";
  5. for ($i = 0; $i < $total_cat; $i++) {
  6.      if ($i != 0)  $tmpSQL .= ",";
  7.      $tmpSQL .="'" . trim($_POST['codecat_' . $i]) . "'";
  8. }
  9.  
  10. $tmpSQL .= ") ORDER BY `iddatagroup`,`idcategory`;";

La sentecia construida tiene que tener este aspecto


Código MySQL:
Ver original
  1. SELECT * FROM `datagroups` dg
  2.           LEFT JOIN `datas` d ON d.`datagroupid` = dg.`iddatagroup`
  3.           LEFT JOIN `categories` c ON c.`idcategory` = d.`categoryid`
  4.           WHERE c.`code` IN ('codecat_1','codecat_2',....)
  5. ORDER BY `iddatagroup`,`idcategory`;

Algo mas ràpida deberia ser...

Quim
  #3 (permalink)  
Antiguo 19/11/2010, 11:31
 
Fecha de Ingreso: noviembre-2001
Ubicación: México DF
Mensajes: 128
Antigüedad: 22 años, 4 meses
Puntos: 0
Respuesta: Ayudita con un query

Gracias amigo, ya lo probé y funciona de maravillas.
Saludos!!!!
__________________
Nuedi Servicios SA de CV
http://www.nuedi.mx

Etiquetas: query
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 02:30.