2009-06-25 7 views
0

3 개의 테이블이 있습니다. Apls, Hulls 및 AplsHulls.다중 차원 배열을 반복하여 PHP에서 격자를 표시합니다.

이 Apls의는 ID, 이름, 선체가 ID를 구성 날짜 구성, 조인 테이블을 AplsHulls입니다 production_name과 아이디, apl_id, hull_id 상태로 구성되어 있습니다.

모든 선체가 각 APL과 관련되는 것은 아닙니다. 상태가 포함 된 조인 테이블에있는 항목 (출고시, 생산 중 등)

다음 열 머리글이있는 표/표에 보고서를 표시해야합니다. Apl 이름, Apl_Date 다음에 선체 프로덕션 이름을 나머지 열 제목으로 사용합니다. (선체 7이 결과 집합에 없으면 심지어 열을 얻지 못합니다.)

데이터의 경우 apl 이름을 나열하고 날짜를 입력 한 다음 나머지 열을 반복하고 상태를 채워야합니다 조인 테이블의 레코드에 대해 .appl과 선체가 조인 테이블에 연결되어 있지 않으면 "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의 표 ID : 1 명 : X1-0000, 날짜 : 1/1/2009 ID : 2 명 : BG-5480, 날짜 : 2009년 2월 22일 번호 : 3, 이름 : HG-0000, 날짜 : 2009년 2월 27일 선체 표 ID : 1 Production_name : ProdA ID : 2 Production_name : ProdB ID : 3 Production_name : ProdC ID : 4 Production_name : ProdD AplsHulls 표 ID : 1 Apl_id : 1 Hull_id : 1 상태 : 전해 ID : 2 Apl_id : 1 Hull_id : 3, 상태 :,174 정렬ID : 3, Apl_id : 2, Hull_id : 4, 상태 : Delivered – 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에서 귀하의 제품 이름이 유효하지 않은 경우 다른 이름으로 매핑해야합니다.

관련 문제