我编写了一些PHP脚本,以便更容易地从一系列MySQL表中提取信息,但是存在严重的性能问题。因此,我试图减少查询的数量。
这些表有一对多的关系:父表(parent_id,第一,最后,电话)子表(child_id,parent_id,日期,请求,详细信息)
因此,对于父表中的任何条目,子表中可能有多个关联行。如何选择父表中的一行并使用parent_id (主键)从子表中提取所有相关行?
SELECT * FROM `Parent Table` WHERE `parent_id` = 5 然后...and ..。
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是子表的名称,是子表中所有字段名的关联数组。
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;
}发布于 2011-10-17 22:16:49
也许我看错了这个问题,但是你看过加入吗?
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);发布于 2011-10-17 22:04:05
我建议将您的JSON缓存在PHP文件中,并仅在发生更改时更新它。
不幸的是,这种情况对DB来说很严重,我个人不知道该怎么做.
https://stackoverflow.com/questions/7799675
复制相似问题