【问题标题】:Optimize query - How can I Select highest and lowest row, group by date from datetime column and return array优化查询 - 如何选择最高和最低行,从日期时间列按日期分组并返回数组
【发布时间】:2019-01-16 21:48:41
【问题描述】:

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

我从这样的表开始:

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"

在此之后,我使用生成的单日/日期来获取最低/最高数据,如下所示:

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
...

这显示日期和链接的低/高值。

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

我想返回一个数组,其中仅包含每天最低和最高行的日期时间。

从我的表格示例来看,第 93 行和第 97 行。

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

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

感谢您花时间阅读我的第一篇文章。 非常感谢任何提示/帮助/示例!

问候 亚历克斯

【问题讨论】:

    标签: php mysql datetime pdo distinct


    【解决方案1】:

    如果您在循环中执行 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
    

    【讨论】:

    • 谢谢!这有助于更接近进行此类查询的最佳方式。我刚刚将:MIN(type) AS lowest, MAX(type) AS highest 替换为 MIN(datetime) AS lowest, MAX(datetime) AS highest 以获取每天最早/最晚的时间!
    猜你喜欢
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多