Foros del Web » Programando para Internet » PHP »

Agrupar registros por años

Estas en el tema de Agrupar registros por años en el foro de PHP en Foros del Web. Queria saber como puedo poner una fila que encabece una serie de registros en función del año que tenga la fecha. Tengo esto: Código PHP: ...
  #1 (permalink)  
Antiguo 24/02/2010, 05:51
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 2 meses
Puntos: 0
Agrupar registros por años

Queria saber como puedo poner una fila que encabece una serie de registros en función del año que tenga la fecha.

Tengo esto:

Código PHP:
include"../conexion.php";
$sql9="SELECT codigo, fechaprueba, tipo, resultado, enlace, conclusiones, propuestas FROM tabla11 WHERE codigo=1 ORDER BY YEAR(fechaprueba) DESC";
$result9 mysql_query($sql9,$conexion) or die(mysql_error());    
                
while(
$row mysql_fetch_array($result9))
    {                                                    
    echo 
"<tr>";
    echo 
"<td>" .$row['codigo']." </td>";                                        
    echo 
"<td >" .$row['fechaprueba']. "</td>";
    echo 
"<td>" .($row['tipo']). "</td>";
    echo 
"<td >" .($row['resultado']). "</td>";
    echo 
"<td><a href='" .$row['enlace']. "'><u>Ver</u></a></td>";
    echo 
"<td>" .($row['conclusiones']). "</td>";
    echo 
"<td>" .($row['propuestas']). "</td>";                                            
echo 
"</tr>";
include
"../cerrar_conexion.php"
Con la consulta saco los registros ordenados por años, pero yo quería que en la tabla que se visualizan todos los datos me pusiese una fila con el año,es decir, que si tengo 40 registros y 10 son de 2010 y 30 de 2009 me tendría que poner una fila que ponga 2010 y a continuacion los registros de 2010 y luego otra fila de 2009 y a continuacion los registros de 2009

¿Que codigo PHP tengo que poner para hacer esto?
Gracias
  #2 (permalink)  
Antiguo 24/02/2010, 05:58
 
Fecha de Ingreso: diciembre-2009
Ubicación: entre Ibiza y Barcelona :)
Mensajes: 92
Antigüedad: 14 años, 4 meses
Puntos: 3
Respuesta: Agrupar registros por años

Hola, yo ayer hice una pregunta parecia, pero yo queria que los registros me los mostra por mes.
Te dejo el codigo por si te sirve de algo.
Código PHP:
<?php 
session_start
(); 
require (
'db_connect.php'); 
require (
'functions.php'); 
connectar_imc(); 
?> 
<form action = "m5.php" method = "post"> 
<?php 
    
     
    
echo "<select name=\"year\" id=\"year\">"
    for(
$i=date(Y);$i>=2005;$i--) { 
        echo 
"<option value=\"".$i."\""
        if(
$_POST['year']==$i) echo " selected"
        echo 
">".$i."</option>"
    } 
    echo 
"</select>"
    echo 
"&nbsp;<input id=\"button\" name=\"enviar\" class=\"boton\" type=\"submit\" value=\"Ver\" "
?> 
    </form> 

<?php 
if( $_POST ){       
     
    echo 
"<table border='1'>"
    echo 
"<tr><td><b>Distribuidores</b></td><td><b>Enero</b></td><td><b>Febrero</b></td><td><b>Marzo</b></td><td><b>Abril</b></td><td><b>Mayo</b></td><td><b>Junio</b></td><td><b>Julio</b></td><td><b>Agosto</b></td><td><b>Septiembre</b></td><td><b>Octubre</b></td><td><b>Noviembre</b></td><td><b>Diciembre</b></td></tr>"


        
$query_dis=("SELECT id_distributor, distributor_name FROM distributor WHERE deleted_distributor = '0' order by distributor_name"); 
        
$result_dis=(mysql_query($query_dis)); 
         
        while (
$rows mysql_fetch_row($result_dis)){ 
            echo 
"<tr>"
        
            echo 
"<td>";          
            echo 
"<b>$rows[1]</b><br><br>"
            echo 
"</td>";
            
            
            for(
$i=1;$i<=12;$i++) { 
                if(
$i<10$mes="0".$i
                else 
$mes $i
                
$desde $_POST['year']."-".$mes."-01"
                
$hasta $_POST['year']."-".$mes."-31";     
        
                echo 
"<td>"
                echo 
"<b>ALTAS NO DEMO:</b><br>"
                
$query=("SELECT COUNT(client_name), registration_date, SUM(contracted_space/1073741824),id_distributor, id_pay_method, type_of_client, id_client FROM client WHERE id_distributor = '".$rows[0]."'  AND registration_date >= '".$desde."' and registration_date <= '".$hasta."' and demo_account = '0' order by count(client_name)"); 
                
$resultmysql_query($query) or die (mysql_error()); 
                while(
$row=mysql_fetch_array($result)) { 
                        if(
$row[0]==0){ 
                            echo 
"No hay altas en ".$mes."-".$_POST['year']."<br><br>"
                        }else{ 
                            echo   
"Clientes:&nbsp;" .$row[0]."<br>"
                            
"Espacio:&nbsp;".$row[2]."&nbsp;GB<br><br>";      
                        } 
                 
                }     
                echo 
"</td>";      
            }
            
            echo 
"</tr>"
        }        
        

?>
Un saludo y suerte.
  #3 (permalink)  
Antiguo 24/02/2010, 06:17
Avatar de lolitashu  
Fecha de Ingreso: enero-2010
Ubicación: Chile / Santiago / Quilicura
Mensajes: 50
Antigüedad: 14 años, 2 meses
Puntos: 2
Respuesta: Agrupar registros por años

Este es un comienzo, para dejarlo tal cual tu kieres tendras ke modificar algunas cosas

Código PHP:
Ver original
  1. <?php
  2. require"../conexion.php";
  3.  
  4. $consulta8="SELECT year FROM tabla11 GROUP BY year ORDER BY year DESC";
  5. $resultado8 = mysql_query($consulta8,$conexion) or die(mysql_error());
  6.          
  7. while($row1 = mysql_fetch_array($resultado8))
  8.     {  
  9.     $consulta9="SELECT * FROM tabla11 WHERE year = '".$row["year"]."' ORDER BY year DESC";
  10.     $resultado9 = mysql_query($consulta9,$conexion) or die(mysql_error());
  11.     $row = mysql_fetch_array($resultado8);
  12.    
  13.     echo "<table border='1'>";
  14.     echo "<tr>";
  15.     echo "<td>".$row['codigo']."</td>";                                        
  16.     echo "<td >".$row['fechaprueba']."</td>";
  17.     echo "<td>".($row['tipo'])."</td>";
  18.     echo "<td >".($row['resultado'])."</td>";
  19.     echo "<td><a href='" .$row['enlace']."'><u>Ver</u></a></td>";
  20.     echo "<td>".($row['conclusiones'])."</td>";
  21.     echo "<td>".($row['propuestas'])."</td>";
  22.     echo "</tr>";
  23.     echo "</table>";
  24.  
  25. include"../cerrar_conexion.php";
  26. ?>

Si kieres mostrarlo dentro de la misma tabla solo tendrias ke sakar el encabezado fuera de while.
ahora si kieres hacer el encabezado por año, se me okurre hacer un while dentro de otro, ocea este dentro de otro, asi uno te saca los años existentes, i otro los resultados existentes por cada año.
  #4 (permalink)  
Antiguo 24/02/2010, 06:40
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Agrupar registros por años

Quiero poner en una fila sola 2010 y debajo todos los registros de 2010, luego si hay registros de 2009, poner una fila sola 2009 y luego todos los de 2009 y así sucesivamente

¿Como controlo que no me ponga el año en cada fila que saco?, porque solo quiero sacar un titulo con el año y despues todos los registros de ese año


OTRA CUESTION:
Si en la consulta saco los datos del usuario 5, y si ese usuario no está en la base de datos, o sea que no tiene registro alguno, y por lo tanto no me muestra nada, ¿como puedo comprobar para mostrar un mensaje que diga "ESTE USUARIO NO TIENE DATOS" en vez de que no me salga nada?

if (mysql_fetch_array($result9)=="") Algo así?????????

Última edición por luicos; 24/02/2010 a las 07:10
  #5 (permalink)  
Antiguo 24/02/2010, 07:17
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Respuesta: Agrupar registros por años

Para tu primera pregunta
Código PHP:
Ver original
  1. <?php
  2. require"../conexion.php";
  3.  
  4. $consulta8="SELECT year FROM tabla11 GROUP BY year ORDER BY year DESC";
  5. $resultado8 = mysql_query($consulta8,$conexion) or die(mysql_error());
  6.          $row1 = mysql_fetch_array($resultado8) ;
  7. echo "Año ".$row1['year'];
  8.  
  9. while($row1)
  10.     {  
  11.     $consulta9="SELECT * FROM tabla11 WHERE year = '".$row["year"]."' ORDER BY year DESC";
  12.     $resultado9 = mysql_query($consulta9,$conexion) or die(mysql_error());
  13.     $row = mysql_fetch_array($resultado8);
  14.    
  15.     echo "<table border='1'>";
  16.     echo "<tr>";
  17.     echo "<td>".$row['codigo']."</td>";                                        
  18.     echo "<td >".$row['fechaprueba']."</td>";
  19.     echo "<td>".($row['tipo'])."</td>";
  20.     echo "<td >".($row['resultado'])."</td>";
  21.     echo "<td><a href='" .$row['enlace']."'><u>Ver</u></a></td>";
  22.     echo "<td>".($row['conclusiones'])."</td>";
  23.     echo "<td>".($row['propuestas'])."</td>";
  24.     echo "</tr>";
  25.     echo "</table>";
  26.  }
  27. include"../cerrar_conexion.php";
  28. ?>
o algo parecido.
A tu segunda pregunta:

Código PHP:
Ver original
  1. $sql="SELECT * FROM tabla WHERE user='".$user."'";
  2. $cosas=mysql_query($sql) or die ("error");
  3.  
  4. $numeroresultados=mysql_num_rows($cosas);
  5.  
  6. if($numeroresultados==0)   { echo "USER SIN DATOS"; }
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #6 (permalink)  
Antiguo 24/02/2010, 07:49
Avatar de lolitashu  
Fecha de Ingreso: enero-2010
Ubicación: Chile / Santiago / Quilicura
Mensajes: 50
Antigüedad: 14 años, 2 meses
Puntos: 2
Respuesta: Agrupar registros por años

Cambia las variables y listo

Código PHP:
Ver original
  1. <?php
  2. require "conecta.php";
  3.  
  4. $anhos="SELECT * FROM noticia GROUP BY year ORDER BY year DESC";
  5. $resanhos = mysql_query($anhos,$dblink);
  6.          
  7. echo "<table border='1'>";       
  8. while($extrae1 = mysql_fetch_array($resanhos))
  9. {  
  10.     echo "<tr><td colspan='4'>Registros del ".$extrae1["year"]."</td></tr>";
  11.    
  12.     $registros="SELECT * FROM noticia WHERE year = ".$extrae1["year"]." ORDER BY year DESC";
  13.     $resregistros = mysql_query($registros,$dblink);
  14.    
  15.     while($extrae2 = mysql_fetch_array($resregistros))
  16.     {
  17.     echo "<tr>";
  18.     echo "<td>".$extrae2['id']."</td>";                                        
  19.     echo "<td>".$extrae2['year']."</td>";
  20.     echo "<td>".$extrae2['titulo']."</td>";
  21.     echo "<td><a href='codigo?id=".$extrae2['id']."'.php><u>Ver</u></a></td>";
  22.     echo "</tr>";
  23.     }
  24. }
  25. echo "</table><br>";
  26.  
  27. mysql_close($dblink);
  28. ?>
  #7 (permalink)  
Antiguo 25/02/2010, 07:00
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Agrupar registros por años

Nada tíos, no acabo de conseguir poner el encabezado con el año antes del grupo de registros de ese año

Tengo esto:¿que opinais?

Código PHP:
$x=$_GET["x"];

$sql999="SELECT year(dataproba) FROM tabla1 GROUP BY year(dataproba) ORDER BY year(dataproba) DESC";
$result999 mysql_query($sql999,$conexion) or die(mysql_error());


$sql9="SELECT codigoproba, dataproba, tipoproba, resultado, enlaceproba, conclusions, propostas FROM tabla1 WHERE codigousuario = '".$x."' AND dataproba = '".$rowanos['year(dataproba)']."' ORDER BY year(dataproba) DESC";
$result9 mysql_query($sql9,$conexion) or die(mysql_error());

while(
$rowanos mysql_fetch_array($result999))
        {
        echo 
"<tr>";
        echo 
"<td colspan='7' bgcolor='#d7d6d6'>" .$rowanos['year']. "</td>";
        echo 
"</tr>";                        
        while(
$row mysql_fetch_array($result9))
              {
              
$dp=$row['dataproba'];
                echo 
"<tr align='center'>";
                echo 
"<td>" .$row['codigoproba']. "</td>";                                        
                echo 
"<td>" .cambiate($dp). "</td>";
                echo 
"<td>" .$row['tipoproba']. "</td>";
                echo 
"<td>" .$row['resultado']. "</td>";
                echo 
"<td><a href='" .$row['enlaceproba']. "'>Ver</a></td>";
                echo 
"<td>" .$row['conclusions']. "</td>";
                echo 
"<td>" .$row['propostas']. "</td>";                                            
                echo 
"</tr>";
              }
        } 
  #8 (permalink)  
Antiguo 25/02/2010, 07:04
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Respuesta: Agrupar registros por años

Tal como te dije, está bien :)
Saludos.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #9 (permalink)  
Antiguo 25/02/2010, 08:42
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Agrupar registros por años

Esta fila está bien??

$row1 = mysql_fetch_array($resultado8) ;

porque me da error

no será..... while ($row1 = mysql_fetch_array($resultado8) )

y además el campo year no lo tengo, será: year(dataproba)

Última edición por luicos; 25/02/2010 a las 08:51
  #10 (permalink)  
Antiguo 26/02/2010, 05:50
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Agrupar registros por años

Ya he conseguido que se muestren los encabezados por año, pero lo que pasa es que me pone todos los encabezados de los años que hay en la tabla y si un usuario no tiene datos en ese año no deberia de poner la fila de año

Hasta ahora tengo esto:

Código PHP:
$sql999="SELECT YEAR(dataproba) FROM tabla1 GROUP BY YEAR(dataproba) ORDER BY YEAR(dataproba) DESC";
    
$result999 mysql_query($sql999,$conexion) or die(mysql_error());    
    while(
$row1 mysql_fetch_array($result999))
        {
            if(
$filas!=0)
                {
                echo 
"<tr>";
                    echo 
"<td colspan='7' bgcolor='#d7d6d6'>" .$row1['YEAR(dataproba)']. "</td>";
                echo 
"</tr>";            
                }
        
$sql9="SELECT codigoproba, dataproba, tipoproba, resultado, enlaceproba, conclusions, propostas FROM tabla1 WHERE codigousuario = '".$x."' AND YEAR(dataproba) = '".$row1['YEAR(dataproba)']."' ORDER BY dataproba DESC";
$result9 mysql_query($sql9,$conexion) or die(mysql_error());                        
        while(
$row mysql_fetch_array($result9))
                            {
                             
///////Codigo para visualizar datos///////
                            
}


Comprobando el número de registros obtenidos de cada usuario por año con:

$filas=mysql_num_rows($result9);
y despues antes de visualizar la fila:
if($filas!=0)

Pero¿como organizo el codigo para hacer esto, o existe otra manera?
  #11 (permalink)  
Antiguo 26/02/2010, 07:10
Avatar de lolitashu  
Fecha de Ingreso: enero-2010
Ubicación: Chile / Santiago / Quilicura
Mensajes: 50
Antigüedad: 14 años, 2 meses
Puntos: 2
Busqueda Respuesta: Agrupar registros por años

Porque poner eso?

Código PHP:
$sql999="SELECT YEAR(dataproba) FROM tabla1 GROUP BY YEAR(dataproba) ORDER BY YEAR(dataproba) DESC"
los nombres de los campos no se definen asi...o estoi entendiendo mal??
si tu campo se llama year solo pones year.. o si se llama dataprobra solo eso, no tienes para que asignarle nombre, si eso es lo que haces, io le puse ese nombre porke pense ke era el ke tu okupabas...Supondré ke el campo donde pones el año se llama dataproba.

Código PHP:
$row1['YEAR(dataproba)']; 
eso esta mal, o se llama year, o se llama dataprobra, o el campo se llama testualmente asi "year(dataprobra)", no se si sea seguro trabajar con parentesis en los nombres de los campos de una bd??

no tien para que definir cada cosa ke estraes, es una lata

Código PHP:
$sql9="SELECT codigoproba, dataproba, tipoproba, resultado, enlaceproba, conclusions, propostas FROM tabla1 WHERE codigousuario = '".$x."' AND YEAR(dataproba) = '".$row1['YEAR(dataproba)']."' ORDER BY dataproba DESC"
solo pone
Código PHP:
$sql9="SELECT * FROM tabla1 WHERE codigousuario = '".$x."' AND dataproba = '".$row1['dataproba']."' ORDER BY dataproba DESC"
y extrae todo, si me dices: "a es ke no okupo todos lo kampos", no importa no pasa nada si extraes i no okupas, al contrario de ke si ocupas i no extraes, ahi keda la kaga

lo otro, creo ke lograrias esto iwalmente usando PHP, es komo te salga mas facil, pero algo para analizar:

Código PHP:
SELECT FROM tabla1 WHERE codigousuario '".$x."' AND dataproba '".$row1['dataproba']."' ORDER BY dataproba DESC"; 
si el año no existe en el registro del usuario, no deberia mostrartelo ya que estas preguntando:

Código PHP:
WHERE codigousuario '".$x."' AND dataproba '".$row1['dataproba']."' 
y esto significaria que si el año y el usuario no coinciden no devolvera nada....

mmm
  #12 (permalink)  
Antiguo 26/02/2010, 09:08
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Agrupar registros por años

A ver...., tengo una tabla en la que tengo un campo que se llama dataproba, y que tiene fechas en formato año/mes/dia.

En la 1ª consulta me saca todos los años que tengo en la BD, y en la segunda consulta me saca los datos de un usuario para el año correspondiente. Por lo tanto, tengo que poner YEAR(dataproba) para sacar los años, sinó sacaría las fechas completas.

Pero el problema no es ese, sinó que me pone una fila con el año que es lo que quería pero includo si no hay registros para ese usuario en ese año.
¿se me entiende?

Tal y como tengo el codigo con un while dentro de otro no se la forma de controlar que no me ponga esa fila

Cita:
WHERE codigousuario = '".$x."' AND dataproba = '".$row1['dataproba']."'
y esto significaria que si el año y el usuario no coinciden no devolvera nada....
Estoy de acuerdo con lo que dices, pero como me visualiza la fila de años antes de llegar a esta consulta, me pone la fila con el año y despues nada, porque como tu dices si no se cumplen las dos condiciones no visualiza nada.

Esta es la estructura del codigo ¿que dices como controlo eso?
Código PHP:
$sql999="SELECT YEAR(dataproba) FROM tabla1 GROUP BY YEAR(dataproba) ORDER BY YEAR(dataproba) DESC";
    
$result999 mysql_query($sql999,$conexion) or die(mysql_error());    
    while(
$row1 mysql_fetch_array($result999))
        {
            if(
$filas!=0)
                {
                echo 
"<tr>";
                    echo 
"<td colspan='7' bgcolor='#d7d6d6'>" .$row1['YEAR(dataproba)']. "</td>";
                echo 
"</tr>";            
                }
        
$sql9="SELECT codigoproba, dataproba, tipoproba, resultado, enlaceproba, conclusions, propostas FROM tabla1 WHERE codigousuario = '".$x."' AND YEAR(dataproba) = '".$row1['YEAR(dataproba)']."' ORDER BY dataproba DESC";
$result9 mysql_query($sql9,$conexion) or die(mysql_error());                        
        while(
$row mysql_fetch_array($result9))
                            {
                             
///////Codigo para visualizar datos///////
                            
}

  #13 (permalink)  
Antiguo 26/02/2010, 09:56
Avatar de lolitashu  
Fecha de Ingreso: enero-2010
Ubicación: Chile / Santiago / Quilicura
Mensajes: 50
Antigüedad: 14 años, 2 meses
Puntos: 2
Respuesta: Agrupar registros por años

Pone esa consulta tambien antes del codigo i con un if preguntar si es distinto de 0 que lo imprima si no, no.
  #14 (permalink)  
Antiguo 26/02/2010, 10:05
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: Agrupar registros por años

Ya lo he visto...

Lo que pasaba era que visualizaba primero la fila del año, sin comprobar si esa fila tenia registros o no

El codigo quedaría así:

Código PHP:
$sql999="SELECT YEAR(dataproba) FROM tabla1 GROUP BY YEAR(dataproba) ORDER BY YEAR(dataproba) DESC";
    
$result999 mysql_query($sql999,$conexion) or die(mysql_error());    
    while(
$row1 mysql_fetch_array($result999))
        {        
            
$sql9="SELECT codigoproba, dataproba, tipoproba, resultado, enlaceproba, conclusions, propostas FROM tabla1 WHERE codigousuario = '".$x."' AND YEAR(dataproba) = '".$row1['YEAR(dataproba)']."' ORDER BY dataproba DESC";
            
$result9 mysql_query($sql9,$conexion) or die(mysql_error());
            
$filas=mysql_num_rows($result9); //MIRO SI TIENE REGISTROS EN ESE AÑO
            
if ($filas!=0)
                {        
                    echo 
"<tr>";
                        echo 
"<td>" .$row1['YEAR(dataproba)']. "</td>";
                    echo 
"</tr>";            
                }                        
        while(
$row mysql_fetch_array($result9))
              {                
                        
///////Visualizar datos///////                
              
}
        } 

Mil gracias a todos por la ayuda, y hasta otra

Etiquetas: agrupar, registros
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 18:53.