Foros del Web » Programando para Internet » PHP »

agrupar datos

Estas en el tema de agrupar datos en el foro de PHP en Foros del Web. Hola a todos, les comento que estoy tratando de hacer un trabajo en cual el cliente agrega a la base de datos eventos por año, ...
  #1 (permalink)  
Antiguo 15/11/2017, 13:05
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Pregunta agrupar datos

Hola a todos, les comento que estoy tratando de hacer un trabajo en cual el cliente agrega a la base de datos eventos por año, solo por año. Lo que estoy tratando de hacer es llamar esos eventos y agruparlos segun el año...
la tabla se llama pasadas y
Código PHP:

<?php
        $sql 
"SELECT * FROM pasadas";
        
$sql mysql_query($sql) or die("No se pudo realizar la consulta");
        
//$row = mysql_fetch_array($sql);    
?>
<div class="container blok1">
    <div class="row">
        <div class="container fotos-museo expopasadas">
        <section class="col-sm-12 col-md-12 col-lg-12">
        <?php
        
while($row mysql_fetch_array($sql)){
        
$anio $row['anio'];
        if (
2016 == $anio){
        
?>
        <br><br>
        <h4>Exposiciones año <?=$row['anio'];?></h4>
        <br><br>
        
  <a href="#" class="pasadasmargen" data-toggle="collapse" data-target="#<?=$row['categoria'];?>"><span class="glyphicon glyphicon-plus-sign"></span> <?=utf8_encode($row['titulo']);?></a>
  <div id="<?=$row['categoria'];?>" class="collapse">
    <div class="col-sm-12 col-md-6 col-lg-6"><br><p><?=utf8_encode($row['contenido']);?></p></div>
    <div class="col-sm-12 col-md-6 col-lg-6"><img class="img-responsive" src="<?=$row['imagen'];?>" width="50%"></div>    
  </div>
  <?php
    
}
    }
  
?>
Lo estoy tratando de hacen con un while, pero hay cosas que se repiten como por ejemplo el <h4>
__________________
Zreep
  #2 (permalink)  
Antiguo 15/11/2017, 14:13
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 9 meses
Puntos: 263
Respuesta: agrupar datos

primero estas utilizando una libreria depreciada y te va a traer problemas en un futuro MUY corto, por otro lado no se como tienes estructurada tu base de datos, pero intenta asi:

Código PHP:
Ver original
  1. function buscar($X){
  2.     $q = $this->db->query("SELECT * FROM tabla WHERE anio = $X ORDER BY id ASC");
  3.     $ca = mysqli_num_rows($q);
  4.     $da = $q->fetch_array();
  5.  
  6.     return ($ca>=1) ? $da : false;
  7. }
  8.  
  9. //Ejecuto la busqueda de los años en mi base de datos
  10. $q = $this->db->query("SELECT anio FROM tabla GROUP BY anio ORDER BY anio ASC");
  11.  
  12. //Verifico si hay resultados
  13. if(mysqli_num_rows($q)>=1){
  14.  
  15.     //Recorro los resultados
  16.     while($row = $q->fetch_array()){
  17.         //Muestro el titulo
  18.         echo "<h4>Exposiciones año ".$row['anio']."</h4>";
  19.         //Envia a la funcion el año para que em regrese los resultados
  20.         $data = buscar($row['anio']);
  21.         //Si hay resultados
  22.         if($data){
  23.             //los recorro
  24.             foreach($data as $key => $value){
  25.                 //Aqui oprganizas los elementos de la respuesta
  26.                 echo '<a href="#" class="pasadasmargen" data-toggle="collapse" data-target="#'.$value['categoria'].'"><span class="glyphicon glyphicon-plus-sign"></span>'.utf8_encode($value['titulo']).'</a><div id="'.$value['categoria'].'" class="collapse"><div class="col-sm-12 col-md-6 col-lg-6"><br><p>'.utf8_encode($value['contenido']).'</p></div><div class="col-sm-12 col-md-6 col-lg-6"><img class="img-responsive" src="'.$value['imagen'].'" width="50%"></div></div>';
  27.             }
  28.         }else{
  29.             //Si no hay resultados
  30.             echo "<p>Sin exposiciones para este año</p>";
  31.         }
  32.  
  33.     }
  34.  
  35.  
  36.  
  37.  
  38. }else{
  39.     echo "No se encontraron registros";
  40. }

quiza haya una manera más simple, asi que prueba esta y ve que otros comentarios salen.

Recuerda utilizar mysqli para tus desarrollos
__________________
[email protected]
HITCEL
  #3 (permalink)  
Antiguo 15/11/2017, 14:38
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: agrupar datos

Gracias xfxstudios, muchas gracias, voy a cambiar el mysqli porque en donde trabajo no lo usan y usan todo con mysql nada mas, quise cambiarlos a PDO, pero no quieren... asi que voy a hacer el cambio y te cuento que tal me fue.

Gracias
__________________
Zreep
  #4 (permalink)  
Antiguo 16/11/2017, 07:53
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: agrupar datos

Lo use y lo adapte, pero me esta tirando este error que no puedo resolver...

Código PHP:
<?php
        
function buscar($X){
        
$sql "SELECT * FROM pasadas WHERE anio = '".$X."' ORDER BY id ASC";
        
$sql mysql_query($sql) or die("No se pudo realizar la consulta");
        
$ca mysql_num_rows($sql);
        
$da mysql_fetch_array($sql);
        
        return (
$ca>=1) ? $da false;
        }
        
$sql mysql_query("SELECT anio FROM pasadas GROUP BY anio ORDER BY anio ASC");
?>
<div class="container blok1">
    <div class="row">
        <div class="container fotos-museo expopasadas">
        <?php
        
if(mysql_num_rows($sql)>=1){
            while(
$row mysql_fetch_array($sql)){
                echo 
"<h4>Exposiciones año ".$row["anio"]."</h4>";
                
$data buscar($row["anio"]);
                if(
$data){
                    foreach(
$data as $key => $value){
        
?>
        <section class="col-sm-12 col-md-12 col-lg-12">
        <h4 class="titulo">Exposiciones año <?=$value["anio"];?></h4>
        
        <br><br>
        <a href="#" class="pasadasmargen" data-toggle="collapse" data-target="#<?=$value["categoria"];?>"><span class="glyphicon glyphicon-plus-sign"></span> <?=utf8_encode($value["titulo"]);?></a>
            <div id="<?=$value["categoria"];?>" class="collapse">
                <div class="col-sm-12 col-md-6 col-lg-6">
                    <br>
                    <?=utf8_encode($value["contenido"]);?>
                </div>
                <div class="col-sm-12 col-md-6 col-lg-6">
                    <img class="img-responsive" src="<?=$value["imagen"];?>" width="50%">
                </div>    
            </div>
        <?php
        
}
        }else{
            echo 
"<p>Sin exposiciones para este año</p>";
            }         
            }
            }else{
                echo 
"No se encontraron registros";
        }
        
?>
        </section>
Error: Illegal string offset 'anio' y lo mismo pasa con titulo...
__________________
Zreep
  #5 (permalink)  
Antiguo 16/11/2017, 07:59
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: agrupar datos

Hola zreep,

Prueba a ponerlo entre comillas simples: $row['anio'] o $value['anio'].

Casi seguro que el problema es ese, ya que tienes los echo con comillas dobles.

Espero que te sirva.
  #6 (permalink)  
Antiguo 16/11/2017, 08:03
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: agrupar datos

Gracias rbczgz, hice el cambio y error continua...
__________________
Zreep
  #7 (permalink)  
Antiguo 16/11/2017, 09:05
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: agrupar datos

Haciendo algunas correcciones llegue a esto:

Código PHP:
<?php
        
function buscar($x){
        
$sql "SELECT * FROM pasadas WHERE anio = '".$x."' ORDER BY id DESC";
        
$sql mysql_query($sql) or die("No se pudo realizar la consulta");
        
$da mysql_fetch_array($sql);
        return 
$da;
        }
        
$sql mysql_query("SELECT anio FROM pasadas GROUP BY anio ORDER BY anio DESC");
        
        if(
$sql){
            while(
$row mysql_fetch_array($sql)){
                echo 
"<h4 class='titulo'>Exposiciones año ".$row['anio']."</h4>";                
                
$data buscar($row['anio']);
                if(
$data['anio'] == $row['anio']){    
                    foreach(
$data as $value){
        
?>
        <section class="col-sm-12 col-md-12 col-lg-12">
        <br><br>
        <a href="#" class="pasadasmargen" data-toggle="collapse" data-target="#<?=$data['categoria'];?>">
        <span class="glyphicon glyphicon-plus-sign"></span> <?=utf8_encode($data['titulo']);?></a>
            <div id="<?=$data['categoria'];?>" class="collapse">
                <div class="col-sm-12 col-md-6 col-lg-6">
                    <br>
                    <?=utf8_encode($data['contenido']);?>
                </div>
                <div class="col-sm-12 col-md-6 col-lg-6">
                    <img class="img-responsive" src="<?=$data['imagen'];?>" width="50%">
                </div>    
            </div>
            </section>
        <?php
        
}
        }else{
            echo 
"<p>Sin exposiciones para este año</p>";
            }         
            }
            }else{
                echo 
"No se encontraron registros";
        }
        
?>
ya no me tira error, pero los que es traer una la ultima publicacion y no todas de un mismo año...
algo as:
Exposiciones año 2016
(titulo) Anio 2015
(titulo) Anio 2015
(titulo) Anio 2015
(titulo) Anio 2015
(titulo) Anio 2015
(titulo) Anio 2015
(titulo) Anio 2015
(titulo) Anio 2015
(titulo) Anio 2015
(titulo) Anio 2015
(titulo) Anio 2015
(titulo) Anio 2015
__________________
Zreep
  #8 (permalink)  
Antiguo 16/11/2017, 17:25
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: agrupar datos

Uhm, ¿y no será tema de implementación?
Lo digo porque claro, trae actualmente la última publicación por el uso del GROUP BY

Así, entonces replanteemos:

Primero que todo,
lo inicial sería saber cuales años existen

Código SQL:
Ver original
  1. SELECT DISTINCT(anio)
  2. FROM pasadas
  3. ORDER BY anio DESC;

Y ya con esto, si recorrer esta primera consulta
y empezar a traer la información correspondiente

Código SQL:
Ver original
  1. SELECT categoria, titulo, contenido, imagen
  2. FROM pasada
  3. WHERE anio = (el año que se esta recorriendo del primer query)
  4. ORDER BY id DESC
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com

Etiquetas: agrupar, mysql, select, sql, tabla
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:17.