Foros del Web » Programando para Internet » PHP »

Listado agrupado por fecha

Estas en el tema de Listado agrupado por fecha en el foro de PHP en Foros del Web. Hola a tod@s: Ya ni recuerdo cuando hice mi última consulta ... Bueno la cuestión es la siguiente. Tengo un apartado dónde se muestra el ...
  #1 (permalink)  
Antiguo 21/12/2009, 13:37
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 3
Listado agrupado por fecha

Hola a tod@s:

Ya ni recuerdo cuando hice mi última consulta ...

Bueno la cuestión es la siguiente. Tengo un apartado dónde se muestra el típico listado de eventos del mes con los campos de fecha y título del evento. Por ejemplo:

Diciembre 2009:

31/12/2009
- Cotillón en la Sala de fiestas

31/12/2009
- Comiendo las uvas en la sociedad

24/12/2009
- Nochebuena

...


Lo que quiero es que el listado me saliera todos los eventos de un mismo día en un bloque, es decir, así:

Diciembre 2009:

31/12/2009
- Cotillón en la Sala de fiestas
- Comiendo las uvas en la sociedad

24/12/2009
Nochebuena

...

Esto ¿se consigue con dos consultas o con subconsultas o con GROUP BY?
¿¿Me podéis poner ejemplos???

Gracias por la ayuda ...
__________________
Saludos,

zacktagnan.
=================================================
  #2 (permalink)  
Antiguo 21/12/2009, 13:53
Avatar de MarioAraque
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Valencia
Mensajes: 1.398
Antigüedad: 14 años, 6 meses
Puntos: 265
Respuesta: Listado agrupado por fecha

Agrupa la consulta por la columna fecha y deberia funcionar. Probaste?

Saludos.
  #3 (permalink)  
Antiguo 21/12/2009, 14:15
 
Fecha de Ingreso: junio-2008
Mensajes: 24
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Listado agrupado por fecha

ninguna consulta va aconcatenar actividades en una sola fila.
Lo que puedes lograr es que todas las actividades de un día apareszan juntas pero en distintas filas. Algo asi:

31/12/2009 Comes uvas
31/12/2009 Año nuevo
30/12/2009 Día X
...etc

luego con algo de logica le dices al php q separe. Podría ser algo asi:

la consulta:
"select * from actividad order by fecha, nombre_actividad desc"

el php luego de la consulta tenfra en $resultado la consulta:

$dia_anterior = 'vacio';//variable de comparacion
while($fila = mysql_fetch_array($resultado))//recorre el dataset
{
if($dia_anterior != $fila["fecha"])//si la nueva fila es de otro dia imprime la fecha y
//la actividad que contiene
{
echo $fila["fecha"]."<br>".$fila["actividad"];
$dia_anterior = $fila["fecha"];//guardamos la ultima fecha
}else//si no es de otro día, solo imprime la actividad
{
echo $fila["fecha"]."<br>";
}
}
  #4 (permalink)  
Antiguo 21/12/2009, 14:16
Avatar de urgido  
Fecha de Ingreso: febrero-2005
Mensajes: 2.351
Antigüedad: 19 años, 1 mes
Puntos: 25
Respuesta: Listado agrupado por fecha

y tu código?
__________________
Hospedaje Web al mejor costo!
  #5 (permalink)  
Antiguo 21/12/2009, 17:41
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 3
Respuesta: Listado agrupado por fecha

Pues este es el código que tengo para crear la consulta:

Código PHP:
$querylimit        '';

$q = new DB_Sql_ext;
$q->connect($panel_Database$panel_Host$panel_User$panel_Password);
$q->Debug $panel_Debug;
$q->Halt_On_Error $panel_Halt_On_Error;

// FILTRO

    
if ($diaactual == '') {        // Si no se recibe ningún Día por GET, se cargan todos los registros del Mes recorrido
$WhereQuery    " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%Y') = '".$anoactual."' AND DATE_FORMAT(fecha, '%m') = '".$mesactual."' ";

    } else {                    
// Si se pulsó en un Dia del calendario, se cargarán solamente los Eventos de ese día
$WhereQuery    " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%d') = '".$diaactual."' AND DATE_FORMAT(fecha, '%Y') = '".$anoactual."' AND DATE_FORMAT(fecha, '%m') = '".$mesactual."' ";
    }
//    // Solamente se muestran los registros cuya fecha no haya pasado aún
    
$WhereQuery    .= " AND ( DATE_FORMAT(fecha, '%Y-%m-%d') >= CURRENT_DATE() )";

$OrderBy    ' ORDER BY fecha DESC, titulo_'.$pref_idioma[$s_lng].', id';

// contar el total de todos los registros sin limitarlos
$querycount "SELECT COUNT(id) AS contador FROM $catalogo_tabla_agenda".$WhereQuery;
if (
$q->query($querycount)) {
    
$q->next_record();
    
// $tot_registros tiene la cuenta de todos los elementos de la BB.DD SIN limitar
    
$tot_registros $q->f('contador');
}

// Consulta que se hace para obtener el listado que se va a mostrar.
$q_listado     "SELECT *, DATE_FORMAT(fecha,'%d/%m/%y') AS fecha_formateada FROM $catalogo_tabla_agenda";
$q_listado    .= $WhereQuery.$OrderBy.$querylimit." ;";

if (
$q->query($q_listado)) {
    if (
$q->num_rows() >= 1) {
        while (
$q->next_record()) {
            
$id                $q->f('id');
            
$fecha            $q->f('fecha_formateada');
            
$titulo            $q->f('titulo_'.$pref_idioma[$s_lng]);

            
$tablistado[]    = array('id' => $id'fecha' => $fecha'titulo' => $titulo);
        }
    }


Y luego saco un mensaje si no hay resultados, y sino saco los registros:

Código PHP:
<?
// Mostrando listado de Registros - Inicio
if (count($tablistado) == 0) { ?>
        <div class="listado_agenda">
          <? echo $msg_agenda[1][$s_lng]; // Sin registros ?>
        </div>
<?
} else {

    for (
$t 0$t count($tablistado); $t++) {
        
$el_enlace_detalle '/'.$pref_lng[$s_lng].'/agenda/detalle/'.genera_link_seo_noext(''$seo_siglas[12], $tablistado[$t]['titulo'], $tablistado[$t]['id']); ?>
        <div class="listado_agenda">
          <div class="fecha_agenda"><? echo $tablistado[$t]['fecha']; ?></div><br />
          <div class="titulo_agenda">
            <a href="<? echo $el_enlace_detalle?>" class="titulo_agenda" title="<? echo $msg_agenda[8][$s_lng]; // ampliar información ?>">&nbsp;<? echo $tablistado[$t]['titulo']; ?></a>
          </div>
        </div>
<?
    
// fin for
}
// Mostrando listado de Registros - Final
?>

De primeras, me ha gustado la solución de AndrewFace, pero tal y como tengo montado para mostrar los resultados con <div> me resulta algo complicado plasmarla.
Así que con vuestras sugerencias, se me ha ocurrido hacer una doble consulta:
- primero, una consulta sobre fechas distintas que tengan eventos y las recorro con un primer bucle 'for'.
- segundo, recorriendo el primer 'for', hago la segunda consulta para sacar los datos según la fecha recorrida en el primer for. Y entonces, para los datos hago un segundo 'for'.

Bueno, ya lo he probado y me sale como quería.

Ahora el nuevo código es como sigue:

Código PHP:
$querylimit        '';

$q = new DB_Sql_ext;
$q->connect($panel_Database$panel_Host$panel_User$panel_Password);
$q->Debug $panel_Debug;
$q->Halt_On_Error $panel_Halt_On_Error;

// FILTRO

    
if ($diaactual == '') {        // Si no se recibe ningún Día por GET, se cargan todos los registros del Mes recorrido
$WhereQuery    " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%Y') = '".$anoactual."' AND DATE_FORMAT(fecha, '%m') = '".$mesactual."' ";

    } else {                    
// Si se pulsó en un Dia del calendario, se cargarán solamente los Eventos de ese día
$WhereQuery    " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%d') = '".$diaactual."' AND DATE_FORMAT(fecha, '%Y') = '".$anoactual."' AND DATE_FORMAT(fecha, '%m') = '".$mesactual."' ";
    }
// Solamente se muestran los registros cuya fecha no haya pasado aún
$WhereQuery    .= " AND ( DATE_FORMAT(fecha, '%Y-%m-%d') >= CURRENT_DATE() )";

$OrderBy    ' ORDER BY fecha DESC, titulo_'.$pref_idioma[$s_lng].', id';

// contar el total de todos los registros sin limitarlos
$querycount "SELECT COUNT(id) AS contador FROM $catalogo_tabla_agenda".$WhereQuery;
if (
$q->query($querycount)) {
    
$q->next_record();
    
// $tot_registros tiene la cuenta de todos los elementos de la BB.DD SIN limitar
    
$tot_registros $q->f('contador');
}

// Consulta que se hace para obtener el listado que se va a mostrar.
$q_listado     "SELECT DISTINCT DATE_FORMAT(fecha,'%d/%m/%y') AS fecha_formateada FROM $catalogo_tabla_agenda";
$q_listado    .= $WhereQuery.$OrderBy.$querylimit." ;";

if (
$q->query($q_listado)) {
    if (
$q->num_rows() >= 1) {
        while (
$q->next_record()) {
            
$fecha            $q->f('fecha_formateada');

            
$tablistado[]    = array('fecha' => $fecha);
        }
    }


Ahora, mientras recorro cada fecha resultante, voy consultando los datos de eventos que haya en la misma, y los voy sacando con el segundo 'for':

Código PHP:
<?
// Mostrando listado de Registros - Inicio
if (count($tablistado) == 0) { ?>
        <div class="listado_agenda">
          <? echo $msg_agenda[1][$s_lng]; // Sin registros ?>
        </div>
<?
} else {

    for (
$t 0$t count($tablistado); $t++) { ?>
        <div class="listado_agenda">
          <div class="fecha_agenda"><? echo $tablistado[$t]['fecha']; ?></div>
<?
        $la_fecha        
explode('/'$tablistado[$t]['fecha']);
        
$la_fecha_dia    $la_fecha[0];
        
$la_fecha_mes    $la_fecha[1];
        
$la_fecha_anio    $la_fecha[2];
        
$q_datos = new DB_Sql_ext;
        
$q_datos->connect($panel_Database$panel_Host$panel_User$panel_Password);
        
$Where_Datos    =  " WHERE publicar = 2 AND DATE_FORMAT(fecha, '%d') = '".$la_fecha_dia."' AND DATE_FORMAT(fecha, '%y') = '".$la_fecha_anio."' AND DATE_FORMAT(fecha, '%m') = '".$la_fecha_mes."' ";
        
$Order_datos    ' ORDER BY fecha DESC, titulo_'.$pref_idioma[$s_lng].', id';
        
$q_limit_datos    '';
        
$q_listado_datos     "SELECT *, DATE_FORMAT(fecha,'%d/%m/%y') AS fecha_formateada FROM $catalogo_tabla_agenda";
        
$q_listado_datos    .= $Where_Datos.$Order_datos.$q_limit_datos." ;";

        if (
$q_datos->query($q_listado_datos)) {
            if (
$q_datos->num_rows() >= 1) {
                
// Iniciando array en cada vuelta para que no acumule datos anteriores
                
$tablistadatos = array();
                while (
$q_datos->next_record()) {
                    
$id                $q_datos->f('id');
                    
$fecha            $q_datos->f('fecha_formateada');
                    
$titulo            $q_datos->f('titulo_'.$pref_idioma[$s_lng]);
        
                    
$tablistadatos[]= array('id' => $id'fecha' => $fecha'titulo' => $titulo);
                }
            } else {
                echo 
'no hay datos';
            }
        }

        for (
$z 0$z count($tablistadatos); $z++) {
            
$el_enlace_detalle '/'.$pref_lng[$s_lng].'/agenda/detalle/'.genera_link_seo_noext(''$seo_siglas[12], $tablistadatos[$z]['titulo'], $tablistadatos[$z]['id']);
?>
          <br />
          <div class="titulo_agenda">
            <a href="<? echo $el_enlace_detalle?>" class="titulo_agenda" title="<? echo $msg_agenda[8][$s_lng]; // ampliar información ?>">&nbsp;<? echo $tablistadatos[$z]['titulo']; ?></a>
          </div>
<?
        
// fin for datos
?>
        </div>
<?
    
// fin for
}
// Mostrando listado de Registros - Final
?>

Pues nada, ahí se queda por si alguna vez a otro le hace falta algo parecido.

Gracias por la inspiración que me habéis facilitado. ¡¡¡Feliz año y tal y tal!!!
__________________
Saludos,

zacktagnan.
=================================================
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 17:54.