How to set up a SQL to display grouped content per month?

1

I need to set up a SQL to group information by month into columns formatted by Bootstrap. Come on:

<div class="container">
    <div class="row">
        <div class="col-md-3">
            <h2 class="eventos_mes">Maio</h2>
            <p>Primeiro Evento Título</p>
            <p>Segundo Evento Título</p>
            <p>Terceiro Evento Título</p>
            <p>Quarto Evento Título</p>
        </div>      
        <div class="col-md-3">
            <h2 class="eventos_mes">Junho</h2>
            <p>Primeiro Evento Título</p>
            <p>Segundo Evento Título</p>
            <p>Terceiro Evento Título</p>
            <p>Quarto Evento Título</p>
        </div>      
        <div class="col-md-3">
            <h2 class="eventos_mes">Julho</h2>
            <p>Primeiro Evento Título</p>
            <p>Segundo Evento Título</p>
            <p>Terceiro Evento Título</p>
            <p>Quarto Evento Título</p>
        </div>
        etc ...
    </div>
</div>

I do not know how I could put together a SQL that would group these events by month separating them with Bootstrap formatting by columns.

For this example, consider that there are only three columns:

  • ID
  • Title
  • Date (mysql format)

Thank you

    
asked by anonymous 21.09.2015 / 14:30

2 answers

3

Your situation does not require any particular consultation. Most of the implementation is when drawing from tables.

Let's say you made a very simple query, sorted by date:

SELECT id, titulo, data
FROM evento
ORDER BY data ASC

At the time we draw the table, we must insert a new row in the table every time the month changes compared to the previous month.

<?php

class Evento
{
    public $id;
    public $data;
    public $titulo;

    public function __construct($id, $data, $titulo)
    {
        $this->id     = $id;
        $this->data   = $data;
        $this->titulo = $titulo;
    }
}

$eventos = [
    new Evento(1, new \DateTime('2015-01-26'), 'Titulo #1'),
    new Evento(1, new \DateTime('2015-01-31'), 'Titulo #2'),
    new Evento(1, new \DateTime('2015-03-02'), 'Titulo #3'),
    new Evento(1, new \DateTime('2015-05-04'), 'Titulo #4'),
    new Evento(1, new \DateTime('2015-05-08'), 'Titulo #5'),
    new Evento(1, new \DateTime('2015-08-01'), 'Titulo #6'),
    new Evento(1, new \DateTime('2015-09-14'), 'Titulo #7'),
    new Evento(1, new \DateTime('2015-09-19'), 'Titulo #8'),
    new Evento(1, new \DateTime('2015-11-10'), 'Titulo #9')
];

?>

<html>
<body>
<?php

echo '<table><tr><td>' . PHP_EOL;
$mesAnterior = null;
foreach ($eventos as $evento) {
    $mesAtual = $evento->data->format('F');
    if ($mesAtual != $mesAnterior) {
         echo '</td></tr><tr><td>' . $mesAtual . '</td><td>' . PHP_EOL;
    }
    echo '<p>' . $evento->titulo . '</p>' . PHP_EOL;
    $mesAnterior = $mesAtual;
}
echo '</td></tr></table>' . PHP_EOL;

?>
</body>
</html>

Output:

<html>
    <body>
        <table>
            <tr>
                <td>January</td>
                <td>
                    <p>Titulo #1</p>
                    <p>Titulo #2</p>
                </td>
            </tr>
            <tr>
                <td>March</td>
                <td>
                    <p>Titulo #3</p>
                </td>
            </tr>
            <tr>
                <td>May</td>
                <td>
                    <p>Titulo #4</p>
                    <p>Titulo #5</p>
                </td>
            </tr>
            <tr>
                <td>August</td>
                <td>
                    <p>Titulo #6</p>
                </td>
            </tr>
            <tr>
                <td>September</td>
                <td>
                    <p>Titulo #7</p>
                    <p>Titulo #8</p>
                </td>
            </tr>
            <tr>
                <td>November</td>
                <td>
                    <p>Titulo #9</p>
                </td>
            </tr>
        </table>
    </body>
</html>
    
21.09.2015 / 14:57
2
$consulta = mysql_query("SELECT * FROM tabela GROUP BY MONTH(data)");

    while($row=mysql_fetch_array($consulta)){
        $consulta_mes = mysql_query("SELECT * FROM tabela WHERE month(data) = month('".$row['data']."')");
        echo "Mês ".$mes;
        while($row_mes=mysql_fetch_array($consulta_mes)){
            echo "Listagem de todos os registros agrupados neste Mês";
        }
    }

Something more or less in this way, it is up to you to correctly adapt your reality.

    
21.09.2015 / 14:51