繁体   English   中英

MySQL中的一对多关系,选择“子”表信息

[英]One to many relationship in MySQL, Selecting “child” table information

我编写了一些PHP脚本,以使从一系列MySQL表中提取信息更加容易,但是仍然存在严重的性能问题。 结果,我试图减少查询的数量。

这些表具有一对多关系:父表(parent_id,第一,最后,电话)子表(child_id,parent_id,日期,请求,详细信息)

因此,对于父表中的任何条目,子表中可能有多个关联的行。 如何在父表中选择一行并使用parent_id(主键)从子表中拉出所有关联的行?

SELECT * FROM `Parent Table` WHERE `parent_id` = 5 

...接着...

SELECT * FROM `Child Table` WHERE `parent_id` = '5'

然后,我想获取结果并将其放入关联数组中,然后将json_encode作为JSON返回。

需要说明的是,我已经可以使用此功能了,但是它正在为选中的每一行执行一个附加查询,因此它不是对一个查询而是对100行进行101查询。

任何帮助将不胜感激,在此先感谢。

更新:建议使用联接,但是出现一个新问题

样本数据:父表(1,'albert','smith','12345')子表(1,1,2010-10-5,'test','etc etc'),(2,1,2010- 10-6,“再次”,“例如”)

进行连接会产生两行

1,albert,smith,12345,1,1,2010-10-5,test等

再次例如,例如1,albert,smith,12345、2、1、2010-10-6

因此,我有两行与父表信息重复。 要使用联接,我需要某种方式来清理它,并将其放入分层形式。

结果应为{parent_id:1, first:albert, last:smith, phone:12345, child_table:[{child_id:1, date:2010-10-5, request:test, details:'etc etc'},{child_id:2, date:2010-10-6, request:again, details:'eg eg'}]}

解决方案:因此,对我来说,答案是使用联接,并编写一个函数将返回的行转换为关联数组

mysqlResult是从请求mysql_query呼叫关联数组,parent_key是父表的主键的名称,child_key是子表的主键的名称,child_table是子表的名称,child_fields是一个关联数组子表中所有字段的名称

   function cleanJoin($mysqlResult, $parent_key, $child_key, $child_table, $child_fields)
    {
    $last_parent = 0;
    $last_child = 0;
    $ch_ctr = 0;

    for ($i = 0; $i < count($mysqlResult); $i++)
    {
        if ($mysqlResult[$i][$child_key] != $last_child)
        {
            echo "new child!";
            $pr_ctr = count($answer[$i]);
            foreach ($child_fields as $field => $type)
            {
               $answer[$pr_ctr][$child_table][$ch_ctr][$field] = $mysqlResult[$i][$field];
               unset($mysqlResult[$field]);
            }
            $ch_ctr++;
        }
        if ($mysqlResult[$i][$parent_key] != $last_parent)
        {
            foreach($mysqlResult[$i] as $field => $value)
            {
                $answer[$i][$field] = $value;
            }
        }
        $last_parent = $mysqlResult[$i][$parent_key];
        $last_child = $mysqlResult[$i][$child_key];
    }

    return $answer;
}

也许我读错了这个问题,但是您看过联接吗?

SELECT * FROM `Parent Table` 
join `Child Table` ON `Child Table`.`Parent ID`=`Parent Table`.`ID`
WHERE `parent_id` = 5 

精简数据的assoc数组的示例

 $res = mysql_query($sql);

 $output = array();

 while ($row = mysql_fetch_assoc($res)) {

    $parent_name = $row['parent_name'];  
    $child_name = $row['child_name'];

    $output[$parent_name][] = $child_name; 
}

var_dump($output);

我建议将JSON缓存在PHP文件中,并仅在发生更改时进行更新

不幸的是,这样的情况对数据库很重,我个人不知道有什么办法...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM