1

DB にクエリを実行する SQL コマンドの配列を作成することは可能ですか? 私が持っているのは3つのテーブルで、それぞれに未払い額の列があります。期日を迎えたものをすべて選択して画面に表示し、請求書 (できれば表) を作成し、各行にそれぞれの顧客の会費を表示できるようにしたいと考えています。

3 つのテーブル間で UNION ALL を使用して予定されているものをすべて選択できますが、テーブルの行に ID でリストする方法がわかりません。

以下は私がこれまでに持っているものです。このペースでは、各クエリを個別に実行し、それらを 3 つの個別のリストにリストする必要があります。提案?

      <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>

コメント後に編集:

クエリが渡され、構文エラーが返されましたYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'all LEFT JOIN table1 ON all.ID = table1.ID LEFT JOIN t' at line 7:

    $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
    ";
4

1 に答える 1

2

上記で作成したテーブル ヘッダーから、3 つの Cost 列が で 1 行に配置されIDていることからJOIN、3 つのテーブルをID. 他の 2 つのテーブルのいずれにも対応する行がない場合でも、LEFT JOINすべての行が存在することを確認するために、ここでa を使用しています。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可能性がある場合、たとえば (信頼できるとは見なされない場合)、 を介して 3 つのテーブルすべてからの合計セットを取得し、それを使用して結合できます。IDTable1Table3Table1.IDDISTINCT IDUNION

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'

ほぼ同じ列構造を持つ 3 つのテーブルが 1 対 1 の関係で存在する場合、おそらく設計上の問題があることに注意してください。これらを 1 つのテーブルに結合することを検討してください。

PHP に関する追加のメモ:

forPHP では、 C/C++ のように繰り返しにインクリメンタル ループを使用することはほとんどありません。代わりに、通常foreach、クエリから行をフェッチするときに orwhileループを使用します。

// 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
于 2012-10-24T00:54:02.153 に答える