php / mysql - 按日期排序

时间:2014-05-23 22:07:38

标签: php mysql sql sorting date-sorting

确定,

所以我有一个包含各种列的表,其中一列是我用来对数据库中的最新条目进行排序的日期列,例如: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范围。输出将自动解析&#39;我想结果并在每次遇到新日期时添加日期标题。

谢谢,

3 个答案:

答案 0 :(得分:2)

只需跟踪日期即可。如果更改,则输出新日期。

// 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>';
}

答案 1 :(得分:0)

记住最后一次日期

$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";
}

或者使用GROUP CONCAT在SQL中执行更多操作:

// 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个字符,因此如果每个日期有大量事件,则不适用。我也建议不要这样做。

答案 2 :(得分:0)

你可以通过像这样的查询中的组连接来做到这一点(尽管它通常对于像ID这样的东西更好:

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

然后会返回如下数据:

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

对于每一行,您可以在foreach语句中轻松爆炸。