优化查询 - 如何 Select 最高行和最低行,按 datetime 列和 return 数组中的日期分组

Optimize query - How can I Select highest and lowest row, group by date from datetime column and return array

我是堆栈溢出的新手,想问问您是否可以查看我的代码并给我一些改进代码并获得所需结果的提示。

我从这样的 table 开始:

Table `time`:

|id|datetime           |type|
|97|2019-01-16 17:22:41|7   |
|96|2019-01-16 16:25:36|5   |
|94|2019-01-16 08:35:01|2   |
|93|2019-01-16 07:45:28|1   |

..还有其他日子,同样的方案,只是不同的类型。

为了仅获取唯一日期,我使用此查询:

"SELECT DISTINCT date(date_format(datetime, '%Y-%m-%d')) as uniquedates, active FROM time WHERE active = 1"

在此之后,我使用生成的单个 days/dates 来获取 lowest/highest 数据,如下所示:

if($count != 0)
{
    while($row = $statement->fetch()) 
    {
        $dates[] = $row['uniquedates'];
    }
}

foreach($dates as $date)
{
    $statement = $pdo->prepare("SELECT MIN(type) AS lowest, MAX(type) AS highest FROM time WHERE datetime LIKE '%$date%'");
    $result = $statement->execute();
    //error handling
    while($row = $statement->fetch()) 
    {
        echo $date ." -> ". $row['lowest'] ." +> ". $row['highest'] ."<br>";
    }
}

所以,我得到如下结果:

2018-12-03 -> 1 +> 7
...
2018-12-13 -> 1 +> 7
2018-12-14 -> 5 +> 6
2018-12-17 -> 1 +> 7
...
2018-12-20 -> 1 +> 7
2018-12-24 -> 10 +> 11
2018-12-21 -> 8 +> 9
2019-01-07 -> 1 +> 7
2019-01-08 -> 1 +> 7
2019-01-11 -> 1 +> 7
2018-12-27 -> 10 +> 11
2018-12-28 -> 10 +> 11
2019-01-14 -> 1 +> 7
2019-01-15 -> 1 +> 7
2019-01-16 -> 1 +> 7
...

这显示了日期和链接的 low/high 值。

不幸的是我无法从那里获取日期时间值,所以我被困在这里。

我想要 return 一个仅包含每天最低行和最高行的日期时间的数组。

因此,从我的 table 示例来看,第 93 行和第 97 行。

|id|datetime           |type|
|97|2019-01-16 17:22:41|7   |
|93|2019-01-16 07:45:28|1   |

我很确定这比我尝试的要容易得多。 :)

感谢您花时间阅读我的第一篇 post。 非常感谢任何 tip/help/example!

问候 亚历克斯

如果您在循环中进行 SQL 查询,您通常会做一些应该属于 SQL.

的事情

尝试以下操作:

SELECT date_format(datetime, '%Y-%m-%d') as d,
  MIN(type) AS lowest,
  MAX(type) AS highest
FROM time
WHERE active = 1
GROUP BY d