如何在mySQL或PHP上基于日期对输出行进行分组?

时间:2017-08-19 12:27:12

标签: php mysql

以下查询返回一些行,每个行都有自己的date_created

SELECT *
FROM   table1 l 
       inner join table2 d 
               ON d.id = l.id 
WHERE  l.company_id = 1

UNION ALL 

SELECT * 
FROM   table1 l 
       inner join table3 p 
               ON p.id = l.id 
WHERE  p.company_id = 1

示例输出:

company_id ---- user_id ---- text ---- dateAndTime
1          ----  abc    ----  hi  ---- 2017-08-17 22:26:18
1          ----  def    ----  hey ---- 2017-08-08 11:57:26
1          ----  abc    ----  hi  ---- 2017-08-08 11:55:40
1          ----  ghz    ----  sup ---- 2017-07-25 16:01:34

我想要实现的目标:

我正在运行一个php foreach循环来显示所有这些数据。但是在每次更改日期时,我都希望显示日期(就像设计方式一样)。

所以输出(显示)

2017-08-17
    1          ----  abc    ----  hi  ---- 2017-08-17 22:26:18
2017-08-08
    1          ----  def    ----  hey ---- 2017-08-08 11:57:26
    1          ----  abc    ----  hi  ---- 2017-08-08 11:55:40
2017-07-25
    1          ----  ghz    ----  sup ---- 2017-07-25 16:01:34

如何使用mySQL或PHP实现此目的?

1 个答案:

答案 0 :(得分:0)

将最后一个日期存储在变量中,检查每次迭代:

$q = "SELECT company_id, user_id, text, dateAndTime, DATE(dateAndTime) as date FROM   table1 l inner join table2 d ON d.id = l.id WHERE  l.company_id = 1 UNION ALL SELECT company_id, user_id, text, dateAndTime, DATE(dateAndTime) as date FROM   table1 l inner join table3 p ON p.id = l.id WHERE  p.company_id = 1";
// ...
$lastGroupDate = null;
foreach ($row as $company) {
    if ($lastGroupDate !== $company["date"]) {
        echo $company["date"]."<br>";
    }
    echo $company["user_id"]."<br>";
    // rest of fields
    $lastGroupDate = $company["date"];
}

请记住在查询中按dateAndTime对结果进行排序。

重要提示:您还需要在查询中获得DATE(dateAndTime) as date,因为您只需按日期(而不是时间)对它们进行分组。