0

私は3つのテーブルを持っています。Apls、Hulls および AplsHulls。

Apls は id、name、date で構成されます Hulls は id、production_name で構成されます AplsHulls は結合テーブルであり、id、apl_id、hull_id、status で構成されます。

すべての Hull が各 Apl に関連付けられているわけではありません。状態 (出荷済み、生産中など) を持つ結合テーブルにあるもの

次の列ヘッダーを持つテーブル/グリッドにレポートを表示する必要があります: Apl Name、Apl_Date、残りの列タイトルとして船体生産名。(ハル 7 が結果セットに含まれていない場合、列も取得されません。

データについては、apl 名、apl 日付をリストし、残りの列をループして、結合テーブルのレコードのステータスを入力する必要があります。apl と hull が結合テーブルに関連付けられていない場合は、セルに「NA」を入力します。

私はこれをさまざまな方法で試しましたが、現在、船体の列ヘッダーの動的リストを取得できますが、データを正しくループさせることができないようです。

Sample Data:

Apls Table

Id: 1, Name: X1-0000, Date: 1/1/2009
Id: 2, Name: BG-5480, Date: 2/22/2009
Id: 3, Name: HG-0000, Date: 2/27/2009

Hulls Table

Id: 1, Production_name: ProdA
Id: 2, Production_name: ProdB
Id: 3, Production_name: ProdC
Id: 4, Production_name: ProdD

AplsHulls Table

Id: 1, Apl_id: 1, Hull_id: 1, Status:Delivered
Id: 2, Apl_id: 1, Hull_id: 3, Status:Ordered
Id: 3, Apl_id: 2, Hull_id: 4, Status:Delivered

次のように表示するテーブルが必要です。

  APL   |     Date     |    ProdA    |   ProdC   | ProdD
X1-0000 |  01/01/2009  |  Delivered  |  Ordered  | NA 
BG-5480 |  02/22/2009  |     NA      |     NA    | Delivered

ProdB のレコードは結合テーブルにまったく含まれていないため、列ヘッダーが ProdB を無視していることに注意してください。また、結合テーブルにある列には NA が入力されますが、結合テーブルに関連付けられていない場合があります。

それは非常に紛らわしいです、私は知っています。

4

2 に答える 2

1

次のようなクエリを使用して、関心のあるハルのリストを取得できます。

select h.id, pname from hulls h join aplshulls on (h.id=hull_id)

今すぐこの回答を読むのをやめて、それを使用して気になる列を取得し、持っているデータをテーブルに入れる方法を理解してください。

しかし、気になるハルのリストを取得したら、プログラムに邪悪なSQLを記述させて、結果を構築することができます。以下のコードは、DB ライブラリが SQL クエリに対して行の配列を返すことを前提としています。

$hulls = query("select h.id, pname from hulls h join aplshulls on (h.id=hull_id)");
/* This should give a result like:
 * $hulls = array(array('id'=>1,'pname'=>'proda'),
 *                array('id'=>3,'pname'=>'prodc'),
 *                array('id'=>4,'pname'=>'prodd'));
 */

$sql = "select name, mdate";
foreach ($hulls as $row) {
    $sql .= ", ifnull({$row['pname']},'NA') {$row['pname']}";
}
$sql .= " from apls ";

foreach ($hulls as $row) {
    $sql .= " left join (select apl_id, status as {$row['pname']} from hulls h \join aplshulls ah on (h.id=hull_id) where pname='{$row['pname']}') as {$row['pn\ame']} on ({$row['pname']}.apl_id=apls.id)";
}
$sql .= " where apls.id in (select distinct apl_id from aplshulls)";

$result = query($sql);
foreach ($result as $row) {
  print "<tr>";
  foreach ($row as $value) {
    print "<td>$value</td>";
  }
  print "</tr>\n";
}

query の呼び出しをデータベース クエリ メソッドに置き換えます。

結果の sql は次のとおりです。

select name, date,
       ifnull(proda,'NA') proda, ifnull(prodc,'NA') prodc, ifnull(prodd,'NA') prodd
from apls
     left join (select apl_id, status as proda
                from hulls h join aplshulls ah on (h.id=hull_id)
                where pname='proda') as proda on (proda.apl_id=apls.id)
     left join (select apl_id, status as prodc
                from hulls h join aplshulls ah on (h.id=hull_id)
                where pname='prodc') as prodc on (prodc.apl_id=apls.id)
     left join (select apl_id, status as prodd
                from hulls h join aplshulls ah on (h.id=hull_id)
                where pname='prodd') as prodd on (prodd.apl_id=apls.id)
where
  apls.id in (select distinct apl_id from aplshulls);

おそらくクエリを作成するためのより良い方法がありますが、これは機能するはずです。ハルの数が非常に多い場合、おそらく故障します。または、関連するテーブルのいずれかが非常に大きい場合。製品名が sql で合法でない場合は、それらを別のものにマップする必要があります。

于 2009-06-29T22:32:52.353 に答える
0

テーブルデータを配列のセットにプルしたと仮定します。

<?php
    $aplToHullMap = array();

    foreach( $AplsHulls as $row )
    {
        $aplID = $row[ 'apl_id' ];
        $hullID = $row[ 'hull_id' ];
        $status = $row[ 'status' ];

        if( isset( $aplToHullMap[ $aplID ] ) )
            $aplToHullMap[ $aplID ][ $hullID ] = $status;
        else
            $aplToHullMap[ $aplID ] = array( $hullID => $status );
    }
?>
<table>
  <tr>
    <th>Apl Name</th>
    <th>Apl Date</th>
<?php
    foreach( $Hulls as $row )
        echo( "<th>" . $row[ 'production_name' ] . "</th>\r\n" );
?>
  </tr>
<?php
    foreach( $Apls as $row )
    {
?>
  <tr>
    <td><?php echo( $row[ 'name' ] ); ?></td>
    <td><?php echo( $row[ 'date' ] ); ?></td>
    <?php
        $map = $aplToHullMap[ $row[ 'id' ] ];

        foreach( $Hulls as $hull )
        {
            if( isset( $map[ $hull[ 'id' ] ] ) )
                $status = $map[ $hull[ 'id' ] ];
            else
                $status = 'NA';

            echo( "<td>" . $status . "</td>\r\n" );
        }
    ?>
  </tr>
<?php
    }
?>
</table>
于 2009-06-25T13:54:01.220 に答える