2009-06-25 12 views
0

私は3つのテーブルを持っています。 Apls、Hulls、およびAplsHulls。PHPでグリッドを表示する多次元配列のループ

AplsはID、名前、日付で構成されます ハルスはid、production_nameで構成されます AplsHullsはid、apl_id、hull_id、statusで構成されています。

各ハルが各Aplに関連付けられているわけではありません。

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

データの場合は、apl名、apl dateをリストし、残りの列をループしてステータスを記入する必要があります結合表のレコードの場合は、結合表に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を無視します。これは、レコードが結合テーブルにまったくないためです。また、結合テーブルにある列に対してはNAが入力されますが、結合テーブルには関連付けられていない可能性があります。

非常に混乱しています。

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

あなたに:あなたはこのようなクエリで気に船体のリストを取得することができます

<?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> 
+0

いくつかのサンプルコードは、おそらくテーブルのデータを参考にしてくれるでしょう。 – jcuenod

+0

データに関する詳細を入力してください。あなたのタイトルが示唆するような配列か、質問自体が示唆するようなDBテーブルにありますか?言葉のついた説明ではなく表の例が役立ちます。 – defines

+0

サンプルデータ: APLS表 番号1、名前:X1-0000、日付:2009年1月1日 イド:2、名称:BG-5480、日:2009年2月22日 イド:3、名:HG-0000、日:2009年2月27日 ハル表 番号1、Production_name:ProdA イド:2、Production_name:ProdB イド:3、Production_name:ProdC イド:4、Production_name:ProdD AplsHulls表 番号1、Apl_id:1、Hull_id:1、状態:配信 イド:2、Apl_id:1、Hull_id:3、ステータス:順序ID:3、Apl_id:2、Hull_id:4、ステータス:配信済み – SonnyBurnette

答えて

0

あなたは配列のセットに、テーブルのデータを引っ張ってきたと仮定すると、この回答を今読んでいるのを止めることができます(そしてたぶんはすべきです)。あなたが気にしているカラムを入手して、あなたが持っているデータをテーブルに入れる方法を見つけてください。

しかし、あなたが気にしている船体のリストを取得すれば、あなたのプログラムはあなたのために結果を構築するために悪意のある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"; 
} 

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

結果の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で合法でない場合は、それらを別のものにマップする必要があります。