php数组中的多个mysql命令

php数组中的多个mysql命令,php,mysql,sql,Php,Mysql,Sql,是否可以构建一个SQL命令数组来查询数据库?我有三个表,每个表都有列,列中有到期金额。希望选择任何到期的内容并显示在屏幕上,以便可以开具发票(最好是在表格中)并在每一行显示其各自的客户费用 我可以在三个表之间使用UNION ALL选择所有到期的内容,但是我不知道如何在表行中按ID列出它们 以下是我到目前为止的情况。按照这种速度,我必须分别运行每个查询,并将它们列在三个单独的列表中。建议 <table> <tr> <

是否可以构建一个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>

从您在上面创建的表头中,通过
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