php数组中的多个mysql命令
是否可以构建一个SQL命令数组来查询数据库?我有三个表,每个表都有列,列中有到期金额。希望选择任何到期的内容并显示在屏幕上,以便可以开具发票(最好是在表格中)并在每一行显示其各自的客户费用 我可以在三个表之间使用UNION ALL选择所有到期的内容,但是我不知道如何在表行中按ID列出它们 以下是我到目前为止的情况。按照这种速度,我必须分别运行每个查询,并将它们列在三个单独的列表中。建议php数组中的多个mysql命令,php,mysql,sql,Php,Mysql,Sql,是否可以构建一个SQL命令数组来查询数据库?我有三个表,每个表都有列,列中有到期金额。希望选择任何到期的内容并显示在屏幕上,以便可以开具发票(最好是在表格中)并在每一行显示其各自的客户费用 我可以在三个表之间使用UNION ALL选择所有到期的内容,但是我不知道如何在表行中按ID列出它们 以下是我到目前为止的情况。按照这种速度,我必须分别运行每个查询,并将它们列在三个单独的列表中。建议 <table> <tr> <
<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>
从您在上面创建的表头中,通过
ID
将三个成本列放在一行中,您似乎暗示希望将这三个表在其ID
上连接在一起。我在这里使用左连接
,以确保表1
中的所有行都存在,即使其他两个表中都没有对应的行
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
不能被认为是权威的),您可以通过一个UNION
从所有3个表中获取不同ID
的集合,并使用该集合来连接:
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中,我们几乎从未像在C/C++中那样使用增量for
循环进行迭代。相反,我们通常使用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>";
}
我想到了这么多建议。1:不要使用mysql_*命令,因为它们已被弃用。2:为什么这些项目在不同的表格中看起来几乎完全相同。3:您不需要使用行和字段,这是一个非常大的开销。@Frederico I重命名了表及其列以避免在这里混淆,它们都提供不同的功能,不应该在同一个表中。@gSaenz使您的表看起来像我的表。它有两个不同之处:1)语法错误的根源是您使用all作为派生表别名,而我使用allID。所有内容均为a,且必须引用背面标记。2) 联合查询中不需要costs或WHERE子句,只需要id。如果你把成本也算进去,你会得到副本刚才是迈克尔·伯克夫斯基edit@MichaelBerkowski完美的问题,我把WHERE子句扔到了1)使我的搜索速度更快,现在(没有WHERE)不是要选择所有内容吗?此外,此方法是否考虑重复?请看,每个表都是不同的产品,每个客户可以拥有多个产品。2) 因此,只想得到那些即将到期的。例如:ID1有表2中的两个产品,一个下个月到期,另一个明年到期。这就是为什么我在
之间使用(并且发票为空
)只获取下个月到期的发票(但尚未开票)@gSaenz Oops,我的错误-虽然我想让您从UNION子查询中省略WHERE,但它仍然需要在主查询中。当我匆忙键入时,我并不打算省略它-在下面添加了它。我重命名了表及其列以避免混淆,它们都提供不同的功能,不应该在同一个表中。关于左联,我也考虑过。但是,表2中可能有项目需要开具发票,而该客户(来自表2)可能没有任何项目需要在表1或表3上开具发票。这三个表之间没有关系。我将改为while循环,谢谢你的提示。@gSaenz看看上面添加的新查询,它使用一个子查询来构建所有可能的ID
,无论它们在哪些表中存在或不存在。逻辑似乎在那里,但它返回语法错误。我已经更新了上面的查询。感谢you@gSaenz让你的看起来像我的。它有两个不同之处:1)语法错误的根源是您使用了all
作为派生表别名,而我使用了allID
ALL
是一个MySQL保留关键字,必须用backticks引用。2) 联合查询中不需要costs或WHERE子句,只需要id。如果你把成本也算进去,你会得到重复的。
// 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>";
}
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