按日期排序MYSQL PHP订单,并将结果按每个日期分组

5
我已经尝试寻找解决问题的方法,但我不知道我在搜索什么,所以一直没有好运气。 我有一个简单的MySQL数据库,其中包含一个名为“activities”的表。在该表中,我有“start_date”,“activity_description”和“activity_location”的字段。 我正在尝试使用PHP进行MySQL查询,并按日期升序显示结果,但是所有在同一日期发生的活动都要分开显示。 例如,我正在尝试实现以下内容。 2012-05-03 - 带狗散步 - 公园 - 外出晚餐 - 小意大利餐厅 2012-05-04 - 汽车维修 - 约翰汽车维修店 2012-05-05 - 购物 - 新鲜超市 - 观看电影 - MegaPlex电影院 - 和Sam见面 - 内部小酒馆 到目前为止,我已经确定了MQSQL查询需要像这样:
$result = mysql_query("SELECT * FROM activities ORDER BY start_date ASC")
然后,要显示结果,我需要执行以下操作:
while($row = mysql_fetch_array($result))
{
echo 
  '<strong>' .  
  $row['start_date'] . 
  '</strong>' .
  '<ul><li>' . 
  $row['activity_description'] .
  '</li><li>' .     
  $row['activity_location'] . 
  '</li></ul>'; 
 }              

这样可以得到结果,每个结果都会重复日期:

2012-05-03

  • 遛狗
  • 公园

2012-05-03

  • 外出吃晚餐
  • 小意大利餐厅

2012-05-04

  • 保养汽车
  • 约翰汽车维修店

2012-05-05

  • 买杂货
  • 新鲜超市

2012-05-05

  • 去看电影
  • MegaPlex电影院

2012-05-05

  • 和Sam见面
  • 小酒馆

有什么办法只输出“start_date”一次,对于相同的日期,只输出一次,当日期与前一个日期不同时再次输出?

无论提示多么晦涩难懂,任何有用的建议都将不胜感激。谢谢。

6个回答

3

只需要跟踪日期。

您可以使用过去不会出现的日期或者错误的日期来定义一个日期。

在遍历列表时,只有日期发生变化时才打印标题并保存新日期。就像这样:

$currentDate = false;
while($row = mysql_fetch_array($result))
{
if ($row['start_date'] != $currentDate){
 echo
  '<strong>' .  
  $row['start_date'] . 
  '</strong>' ;
  $currentDate = $row['start_date'];
}
 echo 
  '<ul><li>' . 
  $row['activity_description'] .
  '</li><li>' .     
  $row['activity_location'] . 
  '</li></ul>'; 
 }  

问候, STEFAN


非常感谢STEFAN。那个完美地解决了问题!也感谢其他所有人的快速回复和出色建议。 - user1372279
谢谢STEFAN,我想在一个按日期分隔的表格中使用它。那么需要改变什么? - Amranur Rahman

2
这可以这样做。
<?php

$data = array();

$result = mysql_query("SELECT * FROM activities ORDER BY start_date ASC")

while($row = mysql_fetch_array($result))
{
    if(isset($data[$row['start_date']]))
    {
        $data[$row['start_date']][] = $row;
    }
    else
    {
        $data[$row['start_date']] = array($row);
    }
}

?>

<ul>
    <?php foreach($data as $date => $rows): ?>

    <li>
        <strong><?php echo $date; ?></strong>
        <ul>
            <?php foreach($rows as $row): ?>
                <li><?php echo $row['activity_description']; ?></li>
            <?php endforeach; ?>
        </ul>
    </li>

    <?php endforeach; ?>
</ul>

0

试试这个,可能会起作用:

$last_date = '';    
while($row = mysql_fetch_array($result))
    {
$display_date = ($last_date == $row['start_date']) ? '' : $row['start_date'];
    echo 
      '<strong>' .  
      $display_date . 
      '</strong>' .
      '<ul><li>' . 
      $row['activity_description'] .
      '</li><li>' .     
      $row['activity_location'] . 
      '</li></ul>'; 
$last_date = $row['start_date'];     
}  

0
$result = array();

while($row = mysql_fetch_array($result))
{
    if (empty($result[$row['start_date']]))
    {
        $result[$row['start_date']] = array(); 
    }
    $result[$row['start_date']][] = array($row['activity_description'], $row['activity_location']);
}

foreach($result as $key=>$value)
{
    echo 
       '<strong>' .  
       $key . 
       '</strong>';
    foreach($value as $act)
    {
         '<ul><li>' . 
         $act[0] .
         '</li><li>' .     
         $act[1] . 
         '</li></ul>';
    }
} 

0
将日期放入变量 $date 中,并检查每一行是否日期已更改。
$date = "";while($row = mysql_fetch_array($result)){
if ($date != $row['start_date'])
{
    $date = $row['start_date'];
    echo '<strong>'.$row['start_date'].'</strong>';
}
echo '<ul><li>'.$row['activity_description'].'</li><li>'.$row['activity_location'].'</li></ul>'; 

}


0
尝试像这样做(我省略了一些样式添加,以使它稍微清晰一些):
$yourdate = '';
$output = '';

while($row = mysql_fetch_array($result)) {
    if ($yourdate != $row['start_date']) {
        $output .= $row['start_date'];
    }

    $output .= '<ul><li>' . 
       $row['activity_description'] .
      '</li><li>' .     
      $row['activity_location'] . 
      '</li></ul>';
}

echo $output;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,