首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL中的一对多关系,选择“子”表信息

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

Stack Overflow用户
提问于 2011-10-17 21:17:50
回答 2查看 4K关注 0票数 0

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

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

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

代码语言:javascript
复制
SELECT * FROM `Parent Table` WHERE `parent_id` = 5 

然后...and ..。

代码语言:javascript
复制
SELECT * FROM `Child Table` WHERE `parent_id` = '5'

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

为了澄清,我已经有了这个工作,但是它正在对所选的每一行执行一个额外的查询,所以它不是一个查询,而是对100行执行101查询。

如能提供任何帮助,我们将不胜感激。

更新:有人建议使用Joins,但是出现了一个新的问题

样本数据:父表(1,'albert','smith','12345')子表(1,1,2010-10-5,'test',‘等’),(2,1,10-6,‘再一次’,‘例如’)

执行联接会导致两行

1,艾伯特,史密斯,12345,1,1,2010-10-5,测试等

1,艾伯特,史密斯,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'}]}

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

child_fields是来自mysql_query调用的关联数组,parent_key是父表主键的名称,child_key是子表的主键名,child_table是子表的名称,是子表中所有字段名的关联数组。

代码语言:javascript
复制
   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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-17 22:16:49

也许我看错了这个问题,但是你看过加入吗?

代码语言:javascript
复制
SELECT * FROM `Parent Table` 
join `Child Table` ON `Child Table`.`Parent ID`=`Parent Table`.`ID`
WHERE `parent_id` = 5 

考虑数据的assoc数组示例

代码语言:javascript
复制
 $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);
票数 1
EN

Stack Overflow用户

发布于 2011-10-17 22:04:05

我建议将您的JSON缓存在PHP文件中,并仅在发生更改时更新它。

不幸的是,这种情况对DB来说很严重,我个人不知道该怎么做.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7799675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档