我编写了一些PHP脚本,以便更容易地从一系列MySQL表中提取信息,但是存在严重的性能问题。因此,我正在尝试减少查询次数。
这些表有一对多的关系: 父表(parent_id,first,last,phone) 子表(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,'测试','等等'),(2,1,2010-10-6,'再','例如')
进行连接会产生两行
1,albert,smith,12345,1,1,2010-10-5,测试等等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;
}
答案 0 :(得分:1)
也许我正在读错了这个问题,但是你看过加入了吗?
SELECT * FROM `Parent Table`
join `Child Table` ON `Child Table`.`Parent ID`=`Parent Table`.`ID`
WHERE `parent_id` = 5
consilidated数据的关联数组的示例
$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 :(得分:0)
我建议将您的JSON缓存在PHP文件中,并仅在更改内容时更新
不幸的是,这些案件对DB很重,我个人不知道有什么办法......