Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何循环并显示按日期分组的MYSQL查询结果?_Php_Mysql - Fatal编程技术网

Php 如何循环并显示按日期分组的MYSQL查询结果?

Php 如何循环并显示按日期分组的MYSQL查询结果?,php,mysql,Php,Mysql,我有一个名为pools的表,每个条目都有一个poolid和一个createddate。我正在为自己制作一个仪表板,我希望看到过去一周每天创建的池的列表,包括到目前为止的今天 我有这么多,但这仅仅是8,这实际上是今天到目前为止创建的池的数量,但是我如何检索昨天、2天前、3天前的池的数量,等等 $today= date('Y-m-d'); $weekago=date('Y-m-d', strtotime('-1 week')); $stmt = $pdo->p

我有一个名为pools的表,每个条目都有一个poolid和一个createddate。我正在为自己制作一个仪表板,我希望看到过去一周每天创建的池的列表,包括到目前为止的今天

我有这么多,但这仅仅是8,这实际上是今天到目前为止创建的池的数量,但是我如何检索昨天、2天前、3天前的池的数量,等等

    $today= date('Y-m-d');
    $weekago=date('Y-m-d', strtotime('-1 week'));

        $stmt = $pdo->prepare("SELECT COUNT(*), poolid FROM pools WHERE `createddate` BETWEEN :weekago AND :today GROUP BY createddate ORDER BY createddate DESC");  
        $stmt->execute([':weekago' => $weekago, ':today' => $today]);
        foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
            $numpoolssofartoday= $stmt->rowCount();
        }

echo $numpoolssofartoday;
调整并获得以下内容以实现我的目标:

$stmt = $pdo->prepare("SELECT COUNT(*) as numpools, createddate FROM pools WHERE `createddate` BETWEEN :weekago AND :today GROUP BY createddate ORDER BY createddate DESC");  
$stmt->execute([':weekago' => $weekago, ':today' => $today]);
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
    $numpoolspastweek .= date('m-d',strtotime($row['createddate'])) . " " . $row['numpools']. "<br>";
}

你的问题是你写得太多了:

foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
    $numpoolssofartoday= $stmt->rowCount();
}
echo $numpoolssofartoday;
你现在看到了吗?$numpoolssofartoday应该是一个计数数组。或者至少您应该根据您尝试执行的操作从循环中输出。例如,测试

还可以使用rowCount,它是查询的所有返回行的计数。而不是使用查询返回的计数

因此,我将更改您的SQL,以便更容易地获取总计,并添加日期。poolid是不相关的,因为它将不正确,因为您将多行与GROUP BY子句组合在一起

$sql = 'SELECT createddate, COUNT(poolid) AS total FROM ...';

// I'm to lazy for that looping, and been coding to much so I like to type as little as possible.

$stmt->fetchAll(PDO::FETCH_GROUP);
我还将使用fetchgroup,第一列是分组依据的数据,这样就可以得到这样的数组,并且可以跳过循环

[
    '2017-12-3' => ['total' => '3'],
    '2017-12-2' => ['total' => '5']
]

就像你循环那些不分组的人一样。。。。如果你可以在数据库中设置一些示例数据,那么与数据库相关的问题通常会更容易解决。比如在这个网站上,然后发布url,你可以使用SHOW CREATE TABLE{tablename}来输出你的表模式,然后你只需要使用INSERT在其中插入一些数据就可以了,或者是非常接近,除非你所有的日期都是一样的,然后你只能从加重函数中得到一个,虽然使用了这个,poolid还是有问题的。另外,您应该使用whilefalse!==$row=$stmt->fetchAllPDO::FETCH_ASSOC对使用PDO和prepared statements赞不绝口。Thanks,这是一个使用mysqli的现有站点,它是一个b****来将所有这些转换为PDO,但它必须根据我读到的所有内容来完成。因此我对它进行了更多的调整,并使其正常工作,但它与您编写的略有不同。你不必这么做。你已经帮了我很大的忙了,但是我要把我的工作添加到我的问题中,如果你对为什么这不是最好的方法有任何想法,请分享。我只是做了一个更好的解决方案,更新了它。若我没记错的话,要使用FETCH_GROUP,它会在第一个返回的字段上工作,所以日期必须是第一个。
[
    '2017-12-3' => ['total' => '3'],
    '2017-12-2' => ['total' => '5']
]