是否可以构建一个 SQL 命令数组来查询数据库?我有三个表,每个表都有应付金额的列。想要选择任何到期的东西并显示在屏幕上,以便可以开具发票(最好在表格中)并且每一行都有各自的客户会费。
我可以在三个表之间使用 UNION ALL 选择到期的所有内容,但是我不知道如何在表行中按 ID 列出它们。
以下是我目前所拥有的。按照这个速度,我将不得不分别运行每个查询并将它们列在三个单独的列表中。有什么建议吗?
<table>
<tr>
<th> ID</th>
<th> Cost 1</th>
<th> Cost 2</th>
<th> Cost 3</th>
</tr>
<?php
$list1 = "SELECT ID, Cost FROM Table1 WHERE Invoiced IS NULL;";
//$list2 = "SELECT ID, Price2 FROM Table2 WHERE Expiration BETWEEN '$curDate' AND '$maxDate';";
//$list3 = "SELECT ID, Price3 FROM Table3 WHERE Expiration BETWEEN '$curDate' AND '$maxDate'";
$result = mysql_query($list1, $link) or die(mysql_error());
$num_rows = mysql_num_rows($result);
$num_fields = mysql_num_fields($result);
for ($i=0; $i<$num_rows; $i++) {
for ($j=0; $j<$num_fields; $j++) {
$invoice[$i][mysql_fieldname($result,$j)] = mysql_result($result,$i,mysql_field_name($result,$j));
}
}
//eventually the order it should be listed on screen
for($i=0; $i<count($invoice); $i++) {
echo "<tr><td>".$invoice[$i]["ID"]."</td>
<td>".$invoice[$i]["Cost"]."</td>
<td>".$invoice[$i]["Price2"]."</td>
<td>".$invoice[$i]["Price3"]."</td></tr>";
}
?>
</table>
评论后编辑:
正在传递查询并返回语法错误 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本对应的手册,了解在第 7 行的“all LEFT JOIN table1 ON all.ID = table1.ID LEFT JOIN t”附近使用的正确语法
:
$query = "
SELECT all.ID, table1.Cost1, table2.Price2, tabl3.Price3
FROM
(SELECT ID, Cost1 FROM table1 WHERE Invoiced IS NULL
UNION
SELECT ID, Price2 FROM table2 WHERE Expiration BETWEEN '$curDate' AND '$maxDate'
UNION
SELECT ID, Price3 FROM table3 WHERE Expiration BETWEEN '$curDate' AND '$maxDate') AS all
LEFT JOIN table1 ON all.ID = table1.ID
LEFT JOIN table2 ON all.ID = table2.ID
LEFT JOIN table3 ON all.ID = table3.ID
";
最佳答案
根据您在上面创建的表格标题,通过 ID
将三个 Cost 列放在一行中, 你似乎暗示你想要 JOIN
三张 table 放在一起 ID
.我正在使用 LEFT JOIN
在这里,要确保来自 Table1
的所有行存在,即使在其他两个表中的任何一个中都没有对应的行。
SELECT
Table1.ID,
Table1.Cost as Cost1,
Table2.Price2 AS Cost2,
Table3.Price3 AS Cost3
FROM
Table1
LEFT JOIN Table2 ON Table1.ID = Table2.ID
LEFT JOIN Table3 ON Table1.ID = Table3.ID
WHERE
Table1.Invoiced IS NULL
AND Table2.Expiration BETWEEN '$curDate' AND '$maxDate'
AND Table3.Expiration BETWEEN '$curDate' AND '$maxDate'
评论后更新:
如果Table2
可能有一个 ID
未在 Table1
举行或 Table3
,例如(其中Table1.ID
不能被认为是权威的),你可以获得DISTINCT ID
的总集通过 UNION
来自所有 3 个表并用它来加入反对:
SELECT
allID.ID,
Table1.Cost1,
Table2.Price2 AS Cost2,
Table2.Price3 AS Cost3
FROM
/* Subquery gets a distinct set of IDs from all tables via UNION
so the outer query has a complete list to join against the other tables */
(
SELECT ID FROM Table1
UNION SELECT ID FROM Table2
UNION SELECT ID FROM Table3
) allID
LEFT JOIN Table1 ON allID.ID = Table1.ID
LEFT JOIN Table2 ON allID.ID = Table2.ID
LEFT JOIN Table3 ON allID.ID = Table3.ID
/* Sorry, forgot the WHERE clause here */
WHERE
Table1.Invoiced IS NULL
AND Table2.Expiration BETWEEN '$curDate' AND '$maxDate'
AND Table3.Expiration BETWEEN '$curDate' AND '$maxDate'
请注意,在一对一关系中存在具有几乎相同的列结构的三个表可能意味着设计问题。您可以考虑将它们合并到一个表中。
关于 PHP 的进一步说明:
在 PHP 中,我们几乎从不使用增量 for
像在 C/C++ 中一样循环迭代。相反,我们通常使用 foreach
或者当从查询中获取行时,while
循环。
// Fetch in a while loop
$invoice = array();
// $result is your query resource as you already have it...
while ($row = mysql_fetch_assoc($result)) {
// Accumulate rows into $invoice array
$invoice[] = $row;
}
// Then loop over the array:
foreach ($invoice as $inv) {
echo "<tr>
<td>{$inv['ID']}</td>
<td>{$inv['Cost1']}</td>
<td>{$inv['Cost2']}</td>
<td>{$inv['Cost3']}</td>
</tr>";
}
最后更新:
是的,WHERE
条款将限制满足的所有条件。如果你需要单独限制它们,你必须在子查询中这样做,然后使用相同的 UNION
连接在一起。子查询以获取 ID
的不同集合
SELECT
allID.ID,
T1.Cost1,
T2.Price2 AS Cost2,
T3.Price3 AS Cost3
FROM
(
SELECT ID FROM Table1
UNION SELECT ID FROM Table2
UNION SELECT ID FROM Table3
) allID
LEFT JOIN (SELECT ID, Cost AS Cost1 FROM Table1 WHERE Invoiced IS NULL) T1 ON allID.ID = T1.ID
LEFT JOIN (SELECT ID, Price2 AS Cost2 FROM Table2 WHERE Expiration BETWEEN '$curDate' AND '$maxDate') T2 ON allID.ID = T2.ID
LEFT JOIN (SELECT ID, Price3 AS Cost3 FROM Table3 WHERE Expiration BETWEEN '$curDate' AND '$maxDate') T3 ON allID.ID = T3.ID
关于php数组中的多个mysql命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13041483/