2017-12-05 6 views
0

私は3つのテーブルを持っています。mysqlを使用して3つの異なるテーブルからPHPでデータをレンダリングする

base_income_tble:

id  base_income 
------------------------ 
1  Grants from government 
2  other grants 
3  Taxes 

sub_income_tble:

id  base_id  sub_income 
--------------------------------------- 
1   1   Special Grants 
2   1   General Grants 
3   2   Local authorities 
4   2   private 
5   3   Professional tax 
6   3   garbage tax 
7   3   light tax 

inner_subincome_tble:

id sub_id  inner_subincome 
------------------------------------- 
1  1  matching grant 
2  1  XIIIth finance commission 
3  1  GIA members salary Grant 
4  2  Grants 
5  2  Grants in Lieu 

私は、IDの各テーブルとの関連について、3つのテーブルから値を取得したいです。

私は以下のクエリを試みた:私はHTMLでフォーマット以下のようにデータを表示したい

enter image description here

select base_income, sub_income,inner_subincome from base_income_tble left join 
sub_income_tble ON base_income_tble.id = sub_income_tble.base_id left join 
inner_subincome_tble 
on sub_income_tble.id = inner_subincome_tble.sub_id OR sub_income_tble.id = 
inner_subincome_tble.sub_id; 

と値を取得し

Grants from Government 
    special Grants 
     Matching grant 
     XIIIth finance commission 
     GIA members salary Grant 
    General Grants 
     Grants 
     Grants in Lieu 
other grants 
    Local authorities 
    private 

それは、可能であれば、ネストされたforeachを使用して上記の形式でデータをレンダリングすることは可能ですどのような条件ですか?

答えて

0
頭に浮かぶ

最初の方法 - id番号

select b.id as base_id, s.id as sub_id, i.id as inner_id, b.base_income, s.sub_income, i.inner_subincome from base_income_tble b left join sub_income_tble s on b.id = s.base_id left join inner_subincome_tble i on s.id = i.sub_id 

+---------+--------+----------+------------------------+-------------------+--------------------------+ 
| base_id | sub_id | inner_id | base_income   | sub_income  | inner_subincome   | 
+---------+--------+----------+------------------------+-------------------+--------------------------+ 
|  1 |  1 |  1 | Grants from government | Special Grants | Matching grant   | 
|  1 |  1 |  2 | Grants from government | Special Grants | XIIIth finance comission | 
|  1 |  1 |  3 | Grants from government | Special Grants | GIA members    | 
|  1 |  2 |  4 | Grants from government | General Grants | Grants     | 
|  1 |  2 |  5 | Grants from government | General Grants | Grants in Lieu   | 
|  2 |  3 |  NULL | Other grants   | Local authorities | NULL      | 
|  2 |  4 |  NULL | Other grants   | Private   | NULL      | 
|  3 |  5 |  NULL | Taxes     | Professional tax | NULL      | 
|  3 |  6 |  NULL | Taxes     | Garbage tax  | NULL      | 
|  3 |  7 |  NULL | Taxes     | Light tax   | NULL      | 
+---------+--------+----------+------------------------+-------------------+--------------------------+ 
)再帰的な配列にそれを構築するなど、データベースからすべてのデータのリストを取得

1)、

$data = array(); 

while($r = mysqli_fetch_assoc($rows)){ 

    $bId = 'id' . $r['base_id']; 
    $sId = 'id' . $r['sub_id']; 
    $iId = 'id' . $r['inner_id']; 


    if(!array_key_exists($bId, $data)) 
     $data[$bId] = array('title' => $r['base_income'], 'values' => array()); 

    if($r['sub_id'] && !array_key_exists($sId, $data[$bId]['values'])) 
     $data[$bId]['values'][$sId] = array('title' => $r['sub_income'], 'values' => array()); 

    if($r['sub_id'] && $r['inner_id']) 
     $data[$bId]['values'][$sId]['values'][$iId] = array('title' => $r['inner_subincome']); 
} 

この後の$dataアレイの内容 -

Array 
(
    [id1] => Array 
     (
      [title] => Grants from government 
      [values] => Array 
       (
        [id1] => Array 
         (
          [title] => Special Grants 
          [values] => Array 
           (
            [id1] => Array 
             (
              [title] => Matching grant 
             ) 

            [id2] => Array 
             (
              [title] => XIIIth finance comission 
             ) 

            [id3] => Array 
             (
              [title] => GIA members 
             ) 

           ) 

         ) 

        [id2] => Array 
         (
          [title] => General Grants 
          [values] => Array 
           (
            [id4] => Array 
             (
              [title] => Grants 
             ) 

            [id5] => Array 
             (
              [title] => Grants in Lieu 
             ) 

           ) 

         ) 

       ) 

     ) 

    [id2] => Array 
     (
      [title] => Other grants 
      [values] => Array 
       (
        [id3] => Array 
         (
          [title] => Local authorities 
          [values] => Array 
           (
           ) 

         ) 

        [id4] => Array 
         (
          [title] => Private 
          [values] => Array 
           (
           ) 

         ) 

       ) 

     ) 

    [id3] => Array 
     (
      [title] => Taxes 
      [values] => Array 
       (
        [id5] => Array 
         (
          [title] => Professional tax 
          [values] => Array 
           (
           ) 

         ) 

        [id6] => Array 
         (
          [title] => Garbage tax 
          [values] => Array 
           (
           ) 

         ) 

        [id7] => Array 
         (
          [title] => Light tax 
          [values] => Array 
           (
           ) 

         ) 

       ) 

     ) 

) 

要素は収入の名前を格納し、valuesはその下に表示する必要があるエントリを格納します。配列をとり、タイトルとループを値に出力し、それぞれを呼び出す再帰関数が必要になります。 (おそらくネストされたforeachでこれを行うこともできます)

代わりの方法は、すべてのデータを1つのテーブルに保存することです。 idparent_id、およびincomeのフィールドを持ち、parent_idフィールドが最上位エントリの場合はNULLであり、それ以外の場合はidとなります。これを効率的に表示するコードは、上記とはかなり異なっています。

関連する問題