【问题标题】:How can I display data between specified dates and get a summation of only those data's?如何显示指定日期之间的数据并仅获得这些数据的总和?
【发布时间】:2021-09-20 01:17:36
【问题描述】:

所以我正在使用 PHP 和 MySQL(PDO)。我有一个很像下面的表格图像的表格,其中用户将(几乎)每天输入数据。

数据输入示例:

Date Old Case(1) New Case(2) Total Case(1+2) Discharge Conviction Acquittal Other
12-06-2021 1000 500 1500 30 40 18 0
13-06-2021 1500 200 1700 10 14 23 9
14-06-2021 1700 100 1800 19 33 23 18
15-06-2021 1800 200 2000 32 18 07 21

稍后也许他想获取用户指定的两个指定日期之间的数据总数。这也是我的另一个问题。用户将如何指定日期?例如,他会选择'from' date“01-January-2021”和'to' date“01-February-2021”选择后他会输入提交按钮,然后网站上会显示一个表格如下所示,将显示这些日期之间的“出院”总数、“定罪”总数、“无罪”总数和“其他”总数。

最终输出:

Date(Between Two Dates) Last Entry Old Case in Date Range(1) Last Entry New Case in Daterange(2) Total Case(1+2) Total Discharge Total Conviction Total Acquittal Total Other
12-6-2021 to 15-6-2021 1800 200 2000 91 105 71 48

现在我该怎么做这个功能?我无法弄清楚所选日期之间的所有数据将根据其字段汇总然后显示汇总结果的功能!我需要使用 Ajax 吗?

DB-FIDDLE(之前没用过,不知道怎么正确使用。):https://www.db-fiddle.com/f/goPRNPA8Q6QRkn258sdrsd/1

另一个问题:我认为我可以自己解决这个问题,但在尝试了一整天后我无法解决。所以我的数据库中还有其他三列(更新列之后)。它们是“旧案例”、“新案例”以及这两列“总案例”的总和。这个“总案例”成为下一个条目或日期的“旧案例”。在我的最终输出中,它将显示所选“日期范围”之间最后输入的“旧案例”和“新案例”。但我无法弄清楚如何实现这一点。谁能帮帮我?

【问题讨论】:

  • 这似乎更像是一个 SQL 问题。但是我们看不到您的数据库表结构或任何示例数据,因此很难回答。 AJAX在这里是可选的,它只是帮助你避免刷新页面,它与如何查询数据无关
  • @Adyson 感谢您的回复。我已经用表格结构更新了我的问题。很抱歉给您带来不便。
  • 样本数据呢?所需输出的确切示例也将非常有帮助。还请粘贴所有此类信息,例如文本,而不是图片,否则我们不能轻易地使用它来测试潜在的答案等。表格结构也一样,请。如果您想制作一个 DbFiddle 会更有帮助。让这里的志愿者尽可能轻松地为您提供帮助。谢谢。
  • @ADyson 我已经按照你的要求再次编辑了我的帖子。抱歉,我从未使用过 DbFiddle,所以我不知道它实际上是如何工作的,但我仍然尝试过。希望这就是它应该如何使用!也感谢您的协助!真的很感激!

标签: php mysql ajax web


【解决方案1】:

SQL(我假设您的表中有一个自动递增的 ID 列,以便我们可以将前一条记录与当前记录关联起来);

SELECT          CONCAT(MIN(M.Date), ' to ', MAX(M.Date)) AS DateRange, 
                SUM(M.Discharge) AS TotalDischarge, 
                SUM(M.Conviction) AS TotalConviction, 
                SUM(M.Acquittal) AS TotalAcquittal, 
                SUM(M.Other) AS TotalOther, 
                M.NewCase AS LastNewCase, 
                MP.NewCase AS LastOldCase
FROM            tmp_mytable AS M
    LEFT JOIN   tmp_mytable AS MP ON MP.ID = (SELECT MAX(M2.ID) FROM tmp_mytable AS M2)
WHERE           M.Date BETWEEN '2021-01-01' AND '2021-02-01'

我认为您想选择“2021-02-01”之前的记录,而不是“2021-02-01”之前的记录。在这种情况下,将 WHERE 子句更改如下

WHERE           M.Date >= '2021-01-01' 
    AND         M.Date < '2021-02-01'

代码示例:PHP: My.PHP

print "
    <form action=\"./My.PHP\" method=\"POST\">
        Date: 
        From <input type=\"date\" name=\"DateFrom\" required>
        To <input type=\"date\" name=\"DateTo\" required>
        <button type=\"submit\" name=\"btnPost\">Post</button>
    </form>
";

$Recordset = $HTML = [];

if(isset($_POST["btnPost"])){
    $Database = new PDO("Database", "User", "Password");

    $Query = $Database->prepare("
        SELECT          CONCAT(MIN(M.Date), ' to ', MAX(M.Date)) AS DateRange, 
                        SUM(M.Discharge) AS TotalDischarge, 
                        SUM(M.Conviction) AS TotalConviction, 
                        SUM(M.Acquittal) AS TotalAcquittal, 
                        SUM(M.Other) AS TotalOther, 
                        M.NewCase AS LastNewCase, 
                        MP.NewCase AS LastOldCase
        FROM            tmp_mytable AS M
            LEFT JOIN   tmp_mytable AS MP ON MP.ID = (SELECT MAX(M2.ID) FROM tmp_mytable AS M2)
        WHERE           M.Date BETWEEN '{$_POST["DateFrom"]}' AND '{$_POST["DateTo"]}'
    ");

    $Query->execute();
    $Recordset = $Query->fetchAll();
}

foreach($Recordset as $Record){
    $HTML[] = "
        <tr>
            <td>{$Record["DateRange"]}</td>
            <td>{$Record["TotalDischarge"]}</td>
            <td>{$Record["TotalConviction"]}</td>
            <td>{$Record["TotalAcquittal"]}</td>
            <td>{$Record["TotalOther"]}</td>
            <td>{$Record["LastNewCase"]}</td>
            <td>{$Record["LastOldCase"]}</td>
        </tr>
    ";
}

print "
    <table>
        <thead>
            <tr>
                <th>Date</th>
                <th>Discharge</th>
                <th>Conviction</th>
                <th>Acquittal</th>
                <th>Other</th>
                <th>New</th>
                <th>Old</th>
            </tr>
        </thead>
        <tbody>" . implode(null, $HTML) . "</tbody>
    </table>
";

【讨论】:

  • 是否可以使用 concat() 创建一个新列(用于日期到日期输出)并按新列分组? stackoverflow.com/a/50698830/12181863
  • 我认为你不能为 SUM 做到这一点。如果您想要 COUNT 条记录,您可以这样做。
  • @Broken Arrow 谢谢您的回复。对于日期,我希望用户从日期选择器或其他东西中选择“开始日期”和“截止日期”,并根据所选日期,这两个日期之间的所有数据都会发生太阳!
  • @RxN 明白了,这就是我发布两个版本的 WHERE 子句的原因。在这种情况下使用 BETWEEN 。
  • @YHStan 是的,如果您希望每个日期范围有多个摘要行,您可以这样做。但是,在这种情况下,我宁愿将 DATE_FORMAT() 函数用于 GROUP BY 子句,而不是使用新列。
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
相关资源
最近更新 更多