php / mysql - сортировка по дате

В порядке,

Итак, у меня есть таблица с различными столбцами, один из которых является столбцом даты, который я использую для сортировки последних записей в базе данных, например: SELECT * FROM foo ORDER BY date DESC LIMIT 0,25, Это дает мне 25 последних записей.

То, что я хочу, это сгруппировать все записи одной даты вместе в html так, чтобы вывод был:

<li class="date">Date 1.2.2014</li>
<li>Some Entry</li>
<li>Some Entry</li>
<li>Some Entry</li>
<li>Some Entry</li>
<li class="date">Date 1.1.2014</li>
<li>Some Entry</li>
<li>Some Entry</li>

Контейнеры несущественны, они могут быть <li>, <td> без разницы.

Я хотел бы знать, могу ли я сделать это в MYSQL с каким-либо запросом или какая логика PHP мне понадобится, чтобы получить результат таким способом.

Кроме того, он должен быть масштабируемым, другими словами, если я хочу последние 50, 100, 1000 записей, все, что нужно изменить, это LIMIT диапазон в запросе. Вывод будет автоматически "разбираться", я думаю, результат и добавит заголовок даты каждый раз, когда встречается новая дата.

Спасибо,

3 ответа

Решение

Просто следите за датой. Если это изменится, выведите новую дату.

// The current date. Start with nothing.
$currentDate = '';
// Loop through your db results
while ($row = mysql_fetch_assoc($result)) {
    // Check to see if the date of the current row is the same as previous row. 
    if ($currentDate !== $row['yourDateCol']) {
        // echo out date
        echo '<li class="date">'.$row['yourDateCol'].'</li>';
        // save the current date in $currentDate to cehck in next loop iteration
        $currentDate = $row['yourDateCol'];
    }
    // echo out event details
    echo '<li>'.$row['yourEventCol'].'</li>';
}

Вы можете сделать это с помощью группового конкатата в запросе, как это (хотя это обычно работает лучше для таких вещей, как идентификаторы:

select yourDateField, groupConcat(id) 
from someTable order by yourDateField desc limit 0,25

который затем будет возвращать данные как:

2014-05-22
1, 2, 3, 4, 5

для каждой строки, которую вы можете легко взорвать в выражении for each.

Помните последнее свидание

$cur = null;
while($row = mysql_fetch_assoc($r)) {
    if($row['date'] !== $cur) {
        $cur = $row['date'];
        echo "<li class="date">" . $row['date'] . "</li>\n";
    }
    echo "\t<li>" . $row['event'] . "</li>\n";
}

Или сделайте больше в SQL с GROUP CONCAT:

// SELECT date, GROUP_CONCAT(event SEPARATOR '</li><li>') AS entries FROM foo ORDER BY date DESC GROUP BY date LIMIT 25
while($row = mysql_fetch_assoc($r)) {
    echo "<li class="date">" . $row['date'] . "</li><li>" . $row['entries'] . "</li>";
}

Обратите внимание, что entries будет усечен до 1024 символов, поэтому он не подходит, если у вас много событий на дату. Я бы также рекомендовал не делать этого.

Другие вопросы по тегам