我有一个查询,我真的很感激任何帮助。
我有一个第一个查询,在一个表中选择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
行。
答案 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)