php - 使用mysql从三个不同的表中呈现php中的数据

标签 php mysql

我有三张 table 。

基本收入表:

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

子收入表:

 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

内部子收入表:

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 的值。

我尝试了以下查询:

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;

并获取值:

enter image description here

我想在html中显示如下格式的数据:

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来渲染如上格式的数据,如果可以的话条件是什么。

最佳答案

我想到的第一个方法 -

1) 获取数据库中所有数据的列表,包括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                     |
+---------+--------+----------+------------------------+-------------------+--------------------------+

2)将其构建为递归数组

$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
                                (
                                )

                        )

                )

        )

)

title 元素存储收入的名称,values 存储应显示在其下方的条目。现在您只需要一个递归函数,它接受一个数组,输出标题并循环遍历值,为每个值调用自身。 (您也可以使用嵌套的 foreach 来做到这一点)

另一种方法是将所有数据存储在一个表中。只需有 idparent_idvenue 字段,其中 parent_id 字段为 NULL对于顶级条目,相关的 id 应该属于其他所有内容。不过,有效显示此内容的代码与上面的代码有很大不同。

关于php - 使用mysql从三个不同的表中呈现php中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47647950/

相关文章:

php 编译器或语法检查器

php - 从外部网络访问phpmyadmin?

mysql - 更新数量以减去 1

mysql - 从单行中选择重复项?

php - Doctrine 注册自定义 DQL 函数

php - 禁止没有索引页的文件夹使用 403

php - php mysql不打印标点符号显示语法错误

mysql - 如何创建MySQL分层递归查询

mysql - yii2中删除相关记录——最佳实践

php - 移动或桌面浏览器检测并重定向到相应的网页