如何使用 PHP 显示具有 MIN、MAX 和 AVG 值(变量 2)的 SQL SUM 查询结果(变量 1)?

Howto display an SQL SUM query result (variable 1) with MIN, MAX and AVG values (variable 2) using PHP?

我已阅读与我的主题相关的推荐答案 none。

一个关于手术的数据库包含很多 table 和这些字段:table dat_patient(患者,缩写为“p”)数字大约 100,table dat_optherapie(手术,缩写为“op”)大约 1,000 个字段。以下是我用于查询的字段的说明:

p.ID 是与手术中的op.patID相关的自动增量患者指数table。

op.OP1OPVerfahren 包含手术过程,每个手术过程可以有 29 个字符串值(从“1”到“28”和“99”)。

op.OP1Datum 包含手术日期。

op.revision 显示给定数据集的修订次数(对于跟踪更改很重要)。

我现在想列举 table 中执行的所有不同的外科手术 (29)。将 SQL 查询代码嵌入到我的 PHP 框架中效果很好:

基本SQL查询:

    SELECT
        SUM(op.OP1OPVerfahren = "0") AS "Keine Operation durchgeführt",
        SUM(op.OP1OPVerfahren = "1") AS "Bioenterics Intragastric Ballon (BIB)",
        SUM(op.OP1OPVerfahren = "2") AS "Gastric Banding",
        SUM(op.OP1OPVerfahren = "3") AS "Roux-en-Y Gastric Bypass",
        SUM(op.OP1OPVerfahren = "4") AS "Roux-en-Y Gastric Bypass banded",
        SUM(op.OP1OPVerfahren = "5") AS "Scopinaro",
        SUM(op.OP1OPVerfahren = "6") AS "Duodenal Switch (DS)",
        SUM(op.OP1OPVerfahren = "7") AS "Sleeve Resection",
        SUM(op.OP1OPVerfahren = "8") AS "Gastric Pacemaker",
        SUM(op.OP1OPVerfahren = "9") AS "Billroth II",
        SUM(op.OP1OPVerfahren = "10") AS "Gastroplasty",
        SUM(op.OP1OPVerfahren = "11") AS "Fobi / Capella Bypass",
        SUM(op.OP1OPVerfahren = "12") AS "Larrad",
        SUM(op.OP1OPVerfahren = "13") AS "Santoro",
        SUM(op.OP1OPVerfahren = "14") AS "DJB",
        SUM(op.OP1OPVerfahren = "15") AS "TOGA",
        SUM(op.OP1OPVerfahren = "16") AS "Endobarrier",
        SUM(op.OP1OPVerfahren = "17") AS "Gastric Plication",
        SUM(op.OP1OPVerfahren = "18") AS "Stomaphyx",
        SUM(op.OP1OPVerfahren = "19") AS "Omega Loop Bypass",
        SUM(op.OP1OPVerfahren = "20") AS "Omega Loop Bypass banded",
        SUM(op.OP1OPVerfahren = "21") AS "Long Limb Bypass",
        SUM(op.OP1OPVerfahren = "22") AS "Distal Very Long Gastric Bypass (Thurnheer)",
        SUM(op.OP1OPVerfahren = "23") AS "Endoscopic Sclerosation",
        SUM(op.OP1OPVerfahren = "24") AS "Swedish Adjustable Gastric Bypass (SAGB)",
        SUM(op.OP1OPVerfahren = "25") AS "Vertical Banded Gastroplasty (VBG)",
        SUM(op.OP1OPVerfahren = "26") AS "Plastic Abdominal Wall Reconstruction (PAWR)",
        SUM(op.OP1OPVerfahren = "27") AS "Inner Hernia Repair",
        SUM(op.OP1OPVerfahren = "28") AS "Single Anastomosis Duodeno-Ileal Bypass with Sleeve Gastrectomy (SADI-S)",
        SUM(op.OP1OPVerfahren = "99") AS "Anderes OP-Verfahren",
        SUM(op.OP1OPVerfahren LIKE "%") AS "Summe"

        FROM dat_patient p
        LEFT OUTER JOIN dat_optherapie op ON op.patID = p.ID

        WHERE op.OP1Datum BETWEEN "2017-01-01" AND "2020-12-31"
        AND NOT EXISTS (SELECT 1 FROM dat_optherapie op2 WHERE op2.patID = p.ID AND op2.revision > op.revision);

SQL 编辑器 中的 结果如下所示(绿色箭头仅总结了所有找到的手术):

我的 PHP 代码 中的 结果如下所示:

我现在介绍一下每次手术的时间:

op.OP1Dauer 这是进行手术所用的分钟数

我想将 SQL 查询代码扩展为所有汇总手术的最小、最大和平均持续时间,作为三个附加列:

    [...]
    SUM(op.OP1OPVerfahren LIKE "%") AS "Summe",

    MIN(op.OP1Dauer) AS "MIN",
    MAX(op.OP1Dauer) AS "MAX",
    AVG(op.OP1Dauer) AS "AVG"

    FROM dat_patient p
    [...]

PHP 应显示如下:

+-------------------------+---------+---------+---------+---------+
| Surgeries performed     | Sum     | MIN     | MAX     | AVG     |
+-------------------------+---------+---------+---------+---------+
| surgery x               | 9       | 25      | 348     | 125     |
+-------------------------+---------+---------+---------+---------+
| surgery y               | 107     | 87      | 244     | 167     |
+-------------------------+---------+---------+---------+---------+
| surgery z               | 97      | 5       | 57      | 23      |
+-------------------------+---------+---------+---------+---------+
| sum                     | 1019    | not really relevant here    |
+-------------------------+---------+---------+---------+---------+

当我以下列模式更改 SQL 查询时...

已更改 SQL 查询:

    SELECT
        SUM(op.OP1OPVerfahren = "0") AS "Keine Operation durchgeführt",
        SUM(op.OP1OPVerfahren = "1") AS "Bioenterics Intragastric Ballon (BIB)",
        SUM(op.OP1OPVerfahren = "2") AS "Gastric Banding",

        [... abreviated because the same as in first SQL query ...]

        SUM(op.OP1OPVerfahren = "27") AS "Inner Hernia Repair",
        SUM(op.OP1OPVerfahren = "28") AS "Single Anastomosis Duodeno-Ileal Bypass with Sleeve Gastrectomy (SADI-S)",
        SUM(op.OP1OPVerfahren = "99") AS "Anderes OP-Verfahren",
        SUM(op.OP1OPVerfahren LIKE "%") AS "Summe",

        MIN(op.OP1Dauer),
        MAX(op.OP1Dauer),
        AVG(op.OP1Dauer)
                    
        FROM dat_optherapie op
        LEFT OUTER JOIN dat_patient p ON op.patID = p.ID
        WHERE op.OP1Datum BETWEEN "2017-01-01" AND "2020-12-31"

        AND NOT EXISTS (SELECT 1 FROM dat_optherapie op2 WHERE op2.patID = p.ID AND op2.revision > op.revision)

        GROUP BY op.OP1OPVerfahren

...,我在 SQL 编辑器 中看到以下 结果:

基本上,这是显示(受控)正确值的内容(请不要因为“-1”而责备我,这些是我的实验数据,“-1”已被遗留用于测试目的。 ..).此外,我已将由 dat_optherapie 加入的主要 table dat_patient 更改为相反的方式(即使查询中未在此处显示,我需要与患者的关联 table 由于内部区分哪些患者是真实的,哪些仅用于测试目的)。

在 PHP 代码中,我按以下方式显示结果:

    <?php

    [... Preceding PHP code for exporting the results as CSV / XLSX ...]

    function getOP1OPVerfahrenStratification() {
        global $oDatabase;

        $qQuery = ' [... SQL query ...] ';

        $rQuery = mysql_query($qQuery, $oDatabase);
        $result = array("count" => mysql_num_rows($rQuery ), "result" => $rQuery);
        return $result;
    }

    function writeOP1OPVerfahrenStratification($rQuery) {
        if (!$rQuery) {
            $message = '<br>';
            $message .= '<b>Ungültige Abfrage:</b> ' . mysql_error() . '<br>';
            $message .= '<b>Gesamte Abfrage:</b> ' . $qQuery . '<br>';
            echo $message;
        }

        if (mysql_num_rows($rQuery) == 0) {
            $message = '<br>';
            $message .= '<p class="error">Zu diesem Zeitraum liegen noch keine Daten vor.</p> ' . mysql_error() . '<br>';
            echo $message;
        }

        while ($row = mysql_fetch_assoc($rQuery)) {
            echo '<tr>';
            echo '<td>';
            echo "Keine Operation durchgef&uuml;hrt";
            echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['Keine Operation durchgeführt'];
            echo '</td>';

            //echo '<td>';
            //echo "MIN";
            //echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['MIN'];
            echo '</td>';
            //echo '<td>';
            //echo "MAX";
            //echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['MAX'];
            echo '</td>';
            //echo '<td>';
            //echo "AVG";
            //echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['AVG'];
            echo '</td>';
            echo '</tr>';

            echo '</tr>';
            echo '<tr>';
            echo '<td>';
            echo "Bioenterics Intragastric Ballon (BIB)";
            echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['Bioenterics Intragastric Ballon (BIB)'];
            echo '</td>';

            //echo '<td>';
            //echo "MIN";
            //echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['MIN'];
            echo '</td>';
            //echo '<td>';
            //echo "MAX";
            //echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['MAX'];
            echo '</td>';
            //echo '<td>';
            //echo "AVG";
            //echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['AVG'];
            echo '</td>';
            echo '</tr>';

            echo '</tr>';

            [...]

            echo '<tr>';
            echo '<td>';
            echo "Single Anastomosis Duodeno-Ileal Bypass with Sleeve Gastrectomy (SADI-S)";
            echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['Single Anastomosis Duodeno-Ileal Bypass with Sleeve Gastrectomy (SADI-S)'];
            echo '</td>';

            //echo '<td>';
            //echo "MIN";
            //echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['MIN'];
            echo '</td>';
            //echo '<td>';
            //echo "MAX";
            //echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['MAX'];
            echo '</td>';
            //echo '<td>';
            //echo "AVG";
            //echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['AVG'];
            echo '</td>';
            echo '</tr>';

            echo '</tr>';
            echo '<tr>';
            echo '<td>';
            echo "Anderes OP-Verfahren";
            echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['Anderes OP-Verfahren'];
            echo '</td>';

            //echo '<td>';
            //echo "MIN";
            //echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['MIN'];
            echo '</td>';
            //echo '<td>';
            //echo "MAX";
            //echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['MAX'];
            echo '</td>';
            //echo '<td>';
            //echo "AVG";
            //echo '</td>';
            echo '<td class="data_table_r">';
            echo $row['AVG'];
            echo '</td>';
            echo '</tr>';

            echo '</tr>';
            echo '<tr>';
            echo '<td style="font-size: 30px;">';
            echo "Summe";
            echo '</td>';
            echo '<td  class="data_table_r" style="font-size: 30px;">';
            echo $row['Summe'];
            echo '</td>';
            echo '</tr>';
        }
    }

    $beginn = microtime(true);
    $ListResult = getOP1OPVerfahrenStratification();
    $dauer = microtime(true) - $beginn;
    $ListCount = $ListResult['count'];
    ?>

    [... HTML, CSS, JavaScript files - begin ...]

    <?php
        writeOP1OPVerfahrenStratification($ListResult['result']);
        mysql_free_result($result);
    ?>

    [... HTML, CSS, JavaScript files - end ...]

您可能会发现所有这些都是根据情况构建的,我部分同意 - 尽管如此,我的问题不是关于美化。

沿着这条路或者已经在我的 SQL 查询中我修改了代码以便在 PHP 中正确显示。 我看到我得到了显示只有一个且始终相同的单值三元组 MIN、Max 和 AVG:

如果有人能告诉我我的错误在哪里,我将不胜感激。 PHP table 显示出现在许多 echo ... 命令中,我想我应该以我不理解的正确方式将 MIN、MAX 和 AVG 命令集成到那里到目前为止。

自己的解决方案:

当然,上面提到的一个 SUM(...) 一个接一个的聚集是行不通的,因为这会在显示相关 MIN、MAX 的行中构建一个 SQL 查询结果集数组和手术类型(不是总和!)的 AVG 持续时间,但使用 PHP.

无法显示

得到的SQL查询代码是这样的:

    SELECT
    CASE
        WHEN op.OP1OPVerfahren = 0 THEN "keines"
        WHEN op.OP1OPVerfahren = 1 THEN "Bioenterics Intragastric Ballon (BIB)"
        WHEN op.OP1OPVerfahren = 2 THEN "Gastric Banding"
        WHEN op.OP1OPVerfahren = 3 THEN "Roux-en-Y Gastric Bypass"
        WHEN op.OP1OPVerfahren = 4 THEN "Roux-en-Y Gastric Bypass banded"
        WHEN op.OP1OPVerfahren = 5 THEN "Scopinaro"
        WHEN op.OP1OPVerfahren = 6 THEN "Duodenal Switch (DS)"
        WHEN op.OP1OPVerfahren = 7 THEN "Sleeve Resection"
        WHEN op.OP1OPVerfahren = 8 THEN "Gastric Pacemaker"
        WHEN op.OP1OPVerfahren = 9 THEN "Billroth II"
        WHEN op.OP1OPVerfahren = 10 THEN "Gastroplasty"
        WHEN op.OP1OPVerfahren = 11 THEN "Fobi / Capella Bypass"
        WHEN op.OP1OPVerfahren = 12 THEN "Larrad"
        WHEN op.OP1OPVerfahren = 13 THEN "Santoro"
        WHEN op.OP1OPVerfahren = 14 THEN "DJB"
        WHEN op.OP1OPVerfahren = 15 THEN "TOGA"
        WHEN op.OP1OPVerfahren = 16 THEN "Endobarrier"
        WHEN op.OP1OPVerfahren = 17 THEN "Gastric Plication"
        WHEN op.OP1OPVerfahren = 18 THEN "Stomaphyx"
        WHEN op.OP1OPVerfahren = 19 THEN "Omega Loop Bypass"
        WHEN op.OP1OPVerfahren = 20 THEN "Omega Loop Bypass banded"
        WHEN op.OP1OPVerfahren = 21 THEN "Long Limb Bypass"
        WHEN op.OP1OPVerfahren = 22 THEN "Distal Very Long Gastric Bypass (Thurnheer)"
        WHEN op.OP1OPVerfahren = 23 THEN "Endoscopic Sclerosation"
        WHEN op.OP1OPVerfahren = 24 THEN "Swedish Adjustable Gastric Bypass (SAGB)"
        WHEN op.OP1OPVerfahren = 25 THEN "Vertical Banded Gastroplasty (VBG)"
        WHEN op.OP1OPVerfahren = 26 THEN "Plastic Abdominal Wall Reconstruction (PAWR)"
        WHEN op.OP1OPVerfahren = 27 THEN "Inner Hernia Repair"
        WHEN op.OP1OPVerfahren = 28 THEN "Single Anastomosis Duodeno-Ileal Bypass with Sleeve Gastrectomy (SADI-S)"
        WHEN op.OP1OPVerfahren = 99 THEN "Anderes OP-Verfahren"
    END "OP-Verfahren",

    SUM(op.OP1OPVerfahren LIKE "%") AS "Summe der Eingriffe",

    MIN(op.OP1Dauer) AS "MIN",
    MAX(op.OP1Dauer) AS "MAX",
    ROUND(AVG(op.OP1Dauer),2) AS "AVG"
                    
    FROM dat_patient p
    LEFT OUTER JOIN dat_optherapie op ON op.patID = p.ID
    WHERE op.OP1Datum BETWEEN "1950-01-01" AND "2050-12-31"
    AND op.OP1Dauer != -1
    AND p.Testzwecke = 0
    AND NOT EXISTS (SELECT 1 FROM dat_optherapie op2 WHERE op2.patID = p.ID AND op2.revision > op.revision)

    GROUP BY op.OP1OPVerfahren
    ORDER BY op.OP1OPVerfahren

这将导致以下 PHP table 显示:

最后三列是尚未命名的 MIN、MAX 和 AVG(仍需要根据各自的样式进行改编 sheet)。此外,以这种方式执行操作时,不会自动显示那些没有可计算的最小、最大和平均持续时间的手术程序,因为显然,当执行了 0 次手术时,不可能有任何持续时间。