循环遍历一个查询的结果并将它们插入另一个查询,并联合第二个查询的所有结果

时间:2017-04-05 08:36:21

标签: php mysql loops

我有一个查询,我真的很感激任何帮助。

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

$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>";
    }

然而,然后我运行它,我返回以下错误 - &#39;可捕获的致命错误:类mysqli_result的对象无法转换为字符串&#39;在&#39; $ table&#39; AS table行。

1 个答案:

答案 0 :(得分:0)

您在评论中添加的部分是更好的尝试,因此我将专注于该代码块。

一些问题:

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

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

  • SQL中的FROM子句不应该跟引号中的内容,而是名称本身,所以不要在那里放单引号

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

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

  • 在SQL中,IS运算符实际上与NULL结合使用,而不是与其他值结合使用。更重要的是,检查与TRUE的平等往往是矫枉过正,因为你可以只测试平等左边的表达

  • 要使用UNION加入不同的SQL代码段,您可以先在数组中收集它们,然后将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)