php数组中的多个mysql命令

标签 php mysql sql

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

相关文章:

php - Ubuntu for php 的 Cron 作业

Mysql_install_db 找不到文件

php - 用于字符串的 MySQL IN

mysql - 在多个表中排序匹配

SQL函数作为默认参数值?

sqlite查询未排序的结果

php - 在 Controller 中覆盖 Yii2 assetManager 配置

php - 在 docker 容器中为 php 启用 soap

phpUnit 配置选项

MySQL 使用 group by 从临时插入