繁体   English   中英

循环浏览一个查询的结果并将其插入另一个查询,并结合第二查询的所有结果

[英]Loop through results of one query and insert them into another, joining with union all results of 2nd query

我有一个查询,非常感谢您的帮助。

我有第一个查询,在一个表中选择job_types(26个结果)。 这些job_type名称都与一个单独的表相关,该表与其名称相同。 然后,我需要使用此结果(job_types列表)在所有相关的job_type表上调用新查询-遍历第一个查询的结果,将其插入第二个查询中,而我试图对结果并将其输出到表中。 但是我坚持循环。 到目前为止,我的代码是:

$sql = "";
$union = "";
$tables = [];

$q = "SELECT DISTINCT job_table 
        FROM job_type 
        WHERE job_type NOT IN (26, 28) AND status = 1";

$tables[] = $conn->query($q);
print_r($tables);

/*while ($table = $tables->fetch_assoc()) {
            $sql .= "SELECT 
                    DATE(call_time) AS `date`,
                    COUNT(*) AS  `sub_total`,
                    '$table->job_table' AS `table` 
                FROM '$table->job_table'
                WHERE table.show IS TRUE AND call_time BETWEEN $startDate AND $endDate
                AND table.processing_complete IS TRUE
                GROUP BY `date`";
            }*/

foreach ($tables AS $table) {
    $sql .= $union . "SELECT 
                    DATE(call_time) AS `date`,
                    COUNT(*) AS  `sub_total`,
                    '$table' AS `table`
                FROM '$table'
                WHERE table.show IS TRUE AND call_time BETWEEN $startDate AND $endDate
                AND table.processing_complete IS TRUE
                GROUP BY `date`";
    $union = " UNION ";

}

我知道我需要放入一个循环,以便合并表并遍历它们直到最后一个,因此WHILE循环和FOREACH循环是我正在尝试的事情。 我只是在(慢慢地)学习PHP,非常感谢您的帮助。

编辑我已经在末尾添加了以下代码以尝试使其显示。

$results = $conn->query($sql);
}
while ($row = $results->fetch_assoc()) {
        echo"<TABLE><TR><TD>". $row["date"]. "</TD>";
        echo"<TD>". $row["sub_total"]. "</TD>";
        echo"<TD>". $row["table"] . "</TD></TR>";
    }

但是,然后运行它,返回以下错误-“ $ table” AS table行上的“可捕获的致命错误:mysqli_result类的对象无法转换为字符串”。

您在注释中添加的部分是更好的尝试,因此我将重点介绍该代码块。

一些问题:

  • query方法返回结果对象。 您不应将其分配给$tables[] ,这会使$tables成为具有一个结果对象的数组。 只需将结果分配给$tables

  • fetch_assoc方法使您的记录可作为关联记录使用,因此您不应使用对象符号$table-> ,而应使用方括号: $table[ ... ]

  • SQL中的FROM子句不应在引号中加上任何东西,而应在名称本身之后,因此不要在其中加上单引号

  • 将表达式嵌入双引号字符串中时,需要将它们用大括号括起来,例如{$table[...]} 没有这些花括号,您只能嵌入原子变量,例如$startDate

  • 在MySql SQL中必须用引号引起来(我假设$startDate$endDate是字符串)

  • 在SQL中, IS运算符实际上旨在与NULL结合使用,而不是与其他值结合使用。 此外,使用TRUE检查相等性通常会过分地杀伤您,因为您可以只测试相等性左侧的表达式

  • 要将不同的SQL代码段与UNION联接在一起,您可以先将它们收集在一个数组中,然后对其施加内implode 另外: UNION ALL具有更好的性能,对您的情况没有影响。

更正的代码:

// *** query method returns a result object, not an array:
$tables = $conn->query($q);

while ($table = $tables->fetch_assoc()) {
    // *** Use {$ ... } notation, with bracket access, not '->'.
    // *** Quote dates. Do not quote tables. Omit "IS TRUE".
    // *** Collect into array. The `UNION` can be added later.
    $sql[] = "
        SELECT 
                DATE(call_start_time) AS `date`,
                COUNT(*) AS  `sub_total`,
                '{$table[job_processing_table]}' AS `table` 
        FROM    {$table[job_processing_table]}
        WHERE   table.show
        AND     call_start_time BETWEEN '$startDate' AND '$endDate'
        AND     table.processing_complete
        GROUP BY `date`";
}

// *** Add UNION:
$sql = implode(" UNION ALL ", $sql)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM