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 символов, поэтому он не подходит, если у вас много событий на дату. Я бы также рекомендовал не делать этого.