Foros del Web » Programando para Internet » PHP »

Agrupar consulta

Estas en el tema de Agrupar consulta en el foro de PHP en Foros del Web. Bueno, tengo el siguiente código: Código PHP: SELECT                       establecimientos . id ,                        establecimientos . de ,                        establecimientos . numero ,                        establecimientos . ...
  #1 (permalink)  
Antiguo 17/04/2008, 13:25
 
Fecha de Ingreso: marzo-2008
Mensajes: 73
Antigüedad: 16 años, 1 mes
Puntos: 0
Pregunta Agrupar consulta

Bueno, tengo el siguiente código:
Código PHP:
SELECT 
                     establecimientos
.id
                     
establecimientos.de
                     
establecimientos.numero
                     
establecimientos.nombre
                     
establecimientos.direccion
                     
establecimientos.tel1
                     
establecimientos.tel2
                     
                     
tipos.tipo

                                     
barrios.barrio

                                     
planes.plan 

                FROM 
                     establecimientos 

                LEFT JOIN tipos ON establecimientos
.tipo tipos.id 

                LEFT JOIN barrios ON establecimientos
.idbarrio barrios.id 

                LEFT JOIN establecimientos2planes ON establecimientos
.id establecimientos2planes.id_est  

                LEFT JOIN planes ON establecimientos2planes
.id_plan planes.id   

                                ORDER BY
                     establecimientos
.idsede
                     
establecimientos.de
                     
establecimientos.tipo
                     
establecimientos.direccion ASC 
Que me devuelve la siguiente tabla:


Porque a cada Establecimiento, le corresponden varios planes... Cómo puedo meter todos los planes juntos en la misma celda y que me muestre solamente una vez cada establecimiento.

Esto logré hacerlo con GROUP BY establecimientos.id, me agrupó los establecimientos, pero me mostraba solamente un plan de cada uno.

Gracias.

PD: Quiero saber qué código PHP necesito para mostrar cada uno de los planes, por eso agrego este post en PHP y no en MySQL.

Saludos!
  #2 (permalink)  
Antiguo 17/04/2008, 14:16
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Re: Agrupar consulta

Holas Clicky

Yo te sugeriría que no agruparas el resultado de la consulta, que sólo lo ordenaras según como quieres que se muestre en la tabla.

Luego, cuando recibes el valor en tu script php, vas comparando cada nueva fila con la anterior: si el Tipo, Nombre, en general los campos que se repiten, es igual al de la fila anterior, no generas el html de las celdas de ese tipo (no muestras los datos) y sólo muestras la celda con el dato de Plan, que es el que sí cambia.

Algo como:
Código PHP:
<?
$sql 
mysql_query("tu consultota");

$ult_tipo false;

while (
$fila mysql_fetch_array($sql))
{
  if (
$ult_tipo != $fila["tipo"])
  {
     
// aqui debes cerrar la ultima celda abierta de la fila anterior. 
     // en el caso de ser la primera fila, deja la fila del encabezado abierta para que
     // al ejecutarse esto, cuadren las celdas.
     
?>
    </td>
   </tr>
   <tr>
    <td><?= $fila["tipo"]; ?></td>
    <td><?= $fila["nombre"]; ?></td>
    <td><?= $fila["plan"]; ?>
     <?
  
}
  else
  {
     
// aqui imprimes un nuevo plan en la misma celda anterior, sin agregar todo lo otro
     
print $fila["plan"]." <br>\n";
  }
  
$ult_tipo $fila["tipo"];
//fin while
?>
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #3 (permalink)  
Antiguo 17/04/2008, 15:02
 
Fecha de Ingreso: marzo-2008
Mensajes: 73
Antigüedad: 16 años, 1 mes
Puntos: 0
De acuerdo Re: Agrupar consulta

Muchísimas Gracias...

Lo voy a probar a la noche cuando vuelva a mi casa y les comento.

Saludos!
  #4 (permalink)  
Antiguo 17/04/2008, 15:10
Avatar de flanagan44  
Fecha de Ingreso: abril-2004
Mensajes: 182
Antigüedad: 20 años
Puntos: 2
Re: Agrupar consulta

yo me encontre con algo parecido y al final lo que me costo menos para arreglarlo fue hacer primero una consulta para obtener las claves principales (lo que seria establecimientos.id)

Un bucle que recorra todos estos id y con ellos hacia un select para obtener el detalle de ellos, asi podia mostrar lo otro (y cierras la celda al terminar cada bucle de los ID)

haber si te sirve, un saludo
  #5 (permalink)  
Antiguo 17/04/2008, 20:52
 
Fecha de Ingreso: marzo-2008
Mensajes: 73
Antigüedad: 16 años, 1 mes
Puntos: 0
Re: Agrupar consulta

Cita:
Iniciado por quinqui Ver Mensaje
Holas Clicky

Yo te sugeriría que no agruparas el resultado de la consulta, que sólo lo ordenaras según como quieres que se muestre en la tabla.

Luego, cuando recibes el valor en tu script php, vas comparando cada nueva fila con la anterior: si el Tipo, Nombre, en general los campos que se repiten, es igual al de la fila anterior, no generas el html de las celdas de ese tipo (no muestras los datos) y sólo muestras la celda con el dato de Plan, que es el que sí cambia.

Algo como:
Código PHP:
<?
$sql 
mysql_query("tu consultota");

$ult_tipo false;

while (
$fila mysql_fetch_array($sql))
{
  if (
$ult_tipo != $fila["tipo"])
  {
     
// aqui debes cerrar la ultima celda abierta de la fila anterior. 
     // en el caso de ser la primera fila, deja la fila del encabezado abierta para que
     // al ejecutarse esto, cuadren las celdas.
     
?>
    </td>
   </tr>
   <tr>
    <td><?= $fila["tipo"]; ?></td>
    <td><?= $fila["nombre"]; ?></td>
    <td><?= $fila["plan"]; ?>
     <?
  
}
  else
  {
     
// aqui imprimes un nuevo plan en la misma celda anterior, sin agregar todo lo otro
     
print $fila["plan"]." <br>\n";
  }
  
$ult_tipo $fila["tipo"];
//fin while
?>
Muchas Gracias por este código, logré implementarlo con bastante éxito...
Ahora si no es mucha molestia, quisiera saber qué es lo que hace exactamente cada paso, porque lo tengo que implementar en una página de "detalles" de cada establecimiento y tengo que hacer esto, más otro igual para idiomas y turnos (ya que cada establecimiento tiene varios turnos e idiomas.)

Gracias!!
  #6 (permalink)  
Antiguo 18/04/2008, 10:46
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Re: Agrupar consulta

Okis, le agregaré comentarios a cada parte :)

Código PHP:
<table>
 <!-- Fila de Encabezado de tu Tabla -->
 <tr>
  <td>TIPO</td>
  <td>NOMBRE</td>
  <td>PLAN
 <!-- Dejo abierta la ultima celda, pues la cerraremos cuando inicie el ciclo WHILE-->
<?
// realiza consulta en la base de datos
$sql mysql_query("tu consultota");

// esta variable guardará el TIPO del ultimo registro leído en el ciclo WHILE
$ult_tipo false;

// recorre el resultado de la consulta. 
// lo va recorriendo registro por registro (fila).
// cada "fila" contiene tantas "columnas" como campos tenia tu consulta.
// o sea, $fila es en verdad un arreglo unidimensional.
while ($fila mysql_fetch_array($sql))
{
  
// si el TIPO es distinto al TIPO del registro anterior,
  // inicias una nueva fila HTML donde escribirás los datos
  // principales (Tipo, Nombre, 1º Plan)
  
if ($ult_tipo != $fila["tipo"])
  {
     
// aqui debes cerrar la ultima celda abierta de la fila anterior. 
     // en el caso de ser la primera fila, deja la fila del encabezado abierta para que
     // al ejecutarse esto, cuadren las celdas.
     
?>
    </td>
   </tr>
   <tr>
    <td><?= $fila["tipo"]; ?></td>
    <td><?= $fila["nombre"]; ?></td>
    <td><?= $fila["plan"]; ?>
     <?
  
}
  else
  {
     
// aqui imprimes un nuevo plan en la misma celda anterior, 
     // sin agregar todo lo otro:
     
print $fila["plan"]." <br>\n";
  }

  
// guardas en memoria el TIPO del registro ACTUAL
  
$ult_tipo $fila["tipo"];

//fin while
?> 
  <!-- Cerramos la celda que quedó abierta con el último registro. 
         Con ello  se cierra tambien la tabla -->
  </td>
 </tr>
</table>
Si falta más explicacion me lo cuentas.

Por cierto, en este código yo no capturé errores, o si encuentra o no registros, ni nada por el estilo, eso queda a cuenta tuya ;)
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #7 (permalink)  
Antiguo 18/04/2008, 12:23
 
Fecha de Ingreso: marzo-2008
Mensajes: 73
Antigüedad: 16 años, 1 mes
Puntos: 0
Re: Agrupar consulta

Gracias, voy a intentar implementarlo en la página de detalles de cada establecimiento, que me genera 64 iguales, una abajo de otra (4 planes X 4 idiomas X 4 turnos) y tengo que juntar todo en uno solo...

Es posible hacerlo con el código este que me pasate vos, no?

Gracias!
  #8 (permalink)  
Antiguo 19/04/2008, 13:55
 
Fecha de Ingreso: marzo-2008
Mensajes: 73
Antigüedad: 16 años, 1 mes
Puntos: 0
Re: Agrupar consulta

Estuve viendo un poco el panorama y encontré algo denominado "foreach"...

No sé bien que será, pero no podría ser útil para esto? Para juntar todos los resultados en una sola $variable e 'imprimirlos' todos juntos?


Gracias!
  #9 (permalink)  
Antiguo 20/04/2008, 17:09
 
Fecha de Ingreso: marzo-2008
Mensajes: 73
Antigüedad: 16 años, 1 mes
Puntos: 0
Re: Agrupar consulta


Nadie sabe?
  #10 (permalink)  
Antiguo 21/04/2008, 08:02
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 19 años, 8 meses
Puntos: 56
Re: Agrupar consulta

Holas Clicky ^^

El foreach es un tipo de "for", que recorre matrices elemento a elemento, dando lo mismo si la matriz está indexada por índices numéricos o por claves, a diferencia del for clásico que recorre las matrices en base al índice numérico (según mi entender, si la matriz es del tipo asociativa —esto es, está indexada por claves— el ciclo for no podría recorrerla, porque no hay números de referencia...).

En tu caso, no sé cómo infuiliría el uso del foreach. De cualquier forma, para recorrer resultados de consulta a base de datos debes usar el while siempre. Ahora, si quieres podrías guardar todo lo que recibas por while, en un arreglo multidimensional, que luego recorrerás usando for o foreach. Pero esto no conviene si son demasiados datos los recibidos (se te acumulan en la memoria del servidor y eso pone lenta la página para el cliente). Ahora si son pocos, guarda los datos recibidos en una matriz, ya filtrados y bien ordenados, de modo que luego recorras dichas matrices y muestres el resultado.

Ejemplo de la estructura de una matriz para tu caso:

Código PHP:
<?
$datos 
= array(
      
"Tipo" => "",
      
"Nombre" => "",
      
"Plan" => array( )
      );

// recorriendo dicha matriz
?>
<table>
<?
foreach ($datos as $encabezado => $valores)
{
  if (
$encabezado == "Plan")
  {
    print
" <td>\n";

    
// aca $valores es un array
    
foreach ($valores as $valor)
    { print 
$valor." <br>\n";  }
    
    
// se cierra la fila con la columna Plan
    
print" </td></tr>\n";
  }
  else
  {
    
// la fila se inicia con la columna Tipo
    
if ($encabezado == "Tipo")
    {  print
"  <tr>\n";  }

    
// aca $valores es una cadena simple
    
print" <td>".$valores."</td>\n";
  }
}
?>
</table>
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #11 (permalink)  
Antiguo 09/03/2012, 16:47
 
Fecha de Ingreso: marzo-2012
Ubicación: ENSENADA BC
Mensajes: 6
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Agrupar consulta

hola soy nueva en esto necesito agrupar una consulta pero no se como hacerlo sin el GROUP BY y con este al momento de agrouparlas me muestra solo la primer variable necesito que me aparescan todos los datos guardados en el campo sin que se repita el campo donde se guardan ,,, amm no se si me explique
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 21:51.