【问题标题】:php/mysql display associated records from related table recursivelyphp/mysql 递归显示相关表中的关联记录
【发布时间】:2012-08-08 20:37:19
【问题描述】:

假设我有 2 个与此类似的相关表: table_1:person_id,姓名; table_2:account_id、person_id、account_type、余额;

我想显示这样的结果:

(A)person_id - 姓名: (a)account_type - 余额, (a)account_type - 余额, (a)account_type - 余额

(B)person_id - 姓名: (b)account_type - 余额

(C)person_id - 姓名: (c)account_type - 余额, (c)account_type - 余额


以下是我目前所拥有的(我不确定是否应该在 2 个查询或仅 1 个连接查询中执行此操作)$where1 和 $search 是当前已经在页面上工作的用户输入搜索字段。 $y 是我传递变量的愚蠢尝试,但我认为这不是我正在尝试做的正确解决方案:

$q = "SELECT person_id, 
FROM table_1 WHERE $where1 LIKE '$search%'"; 
$r = @mysqli_query ($dbc, $q);

$q2 = "SELECT person_id, balance, account_type 
FROM accounts WHERE person_id LIKE '$y%'"; 
$r2 = @mysqli_query ($dbc, $q2);

while($row = mysqli_fetch_array($r)) {
    echo $row['person_id']. " - " .$row['name']. ":";
    $y = $row['person_id'];
    echo "</br>";
        while($row = mysqli_fetch_array($r2)) {
        echo $row['account_type']. " - " .$row['balance'] ."</br>";
        }       
    echo "</br>";
    }

目前显示:

(A)person_id - 姓名: (a)account_type - 余额 (a)account_type - 余额 (a)account_type - 余额 (b)account_type - 余额 (c)account_type - 余额 (c)account_type - 余额

(B)person_id - 姓名:

(C)person_id - 姓名:


我认为 while 内的 while 是这样工作的,但我不确定如何去做。此外,这些东西上面显然有代码,但这些东西都在工作,主要与打开数据库连接和搜索表单有关。

此外,我在此处包含的代码是示例代码,可能以另一种方式出错,但我主要只是在寻找有关如何构建查询和递归以以这种方式显示数据的总体思路我希望它显示出来。

提前感谢大家提供的任何帮助。

【问题讨论】:

    标签: php mysql html recursion inner-join


    【解决方案1】:

    我喜欢做的是把这样的数据放入一个适合我想要输出的显示的多维数组中。这将取决于您拥有多少数据,因为巨大的数组可能会导致问题。我会做一个查询,order by person_id,然后是你想要的任何其他数据。然后遍历您的查询并使用第一个数组键来跟踪person_id

    $output_ary = array();
    while($row = mysqli_fetch_array($r)) {
       if ( !array_key_exists($output_ary, $r['person_id'] ) {
          $output_ary[$r['person_id']] = array();
       }
       $output_ary[$r['person_id']][] = $r; // or a new array with the data elements you want
    }
    

    然后您可以使用嵌套的foreach 循环来输出数据或其他任何内容。可能不是最优雅或最有效的解决方案,但对于较小的数据结果,我发现将数据放入与我想要显示的方式相匹配的结构中对我有用。

    【讨论】:

    • 另外,如果您还没有在代码的其他地方这样做,您应该在查询中使用之前清理发布的数据,以防止 SQL 注入。
    • 我觉得我应该理解这一点,但有些东西只是没有点击。 “如果”到底在做什么?这是在做什么:“$output_ary[$r['person_id']][] = $r;” ? foreach(es) 会去哪里?我已经对我认为它的工作方式做了一些假设,并尝试以几种不同的方式将其应用到我的代码中,但无法获得我需要的结果。非常感谢您花时间回答这个问题,如果您能给我更多帮助,再次感谢。
    • 好吧,我又玩了一点,想出了一个更不优雅的解决方案,在这一点上似乎可行。所以这不再那么紧迫了,但我仍然很想看看它到底在做什么,因为我认为它在未来可能会有用。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多