我的数据库中有200000多行数据,我想要用其他行检查每行的数据并执行某些操作并显示结果。
假设考虑下表(树数据): p_teams
id name parentname placedunder position
1 x root root root
2 y x x left
3 z x x right
4 a x y left
5 b z z right
等......
奖金表包含姓名和奖金。
示例:
name bonus
x 10
y 20
要获得左右树的总奖金,我应该分别找到所有孩子的奖金。所以我需要检查childerns。我有一个逻辑,它适用于较小的数据,但随着数据的增加,执行PHP函数所需的时间也在增加。
这里的逻辑(我使用过codeigniter):
function getBous($name){
$data = array('name'=>$name);
$res = $this->db->get_where('p_teams',$data);
if($res->num_rows()>0){
$data = array('parentname'=>$name);
$this->db->select('name,position');
$res = $this->db->get_where('p_teams',$data);
if($res->num_rows()>0){
$row = $res->result_array();
$i = 0;
$temp = array();
$temp1 = array();
foreach($row as $parent){
$temp[$i] = $parent['name'];
$position[$i] = $parent['position'];
$i = $i+1;
}
$abonus = 0;
$bbonus = 0;
while(sizeof($temp) != 0 && sizeof($position) != 0){
$data = array('name'=>$temp[0]);
$this->db->select('bonus');
$res = $this->db->get_where('bonus',$data);
if($res->num_rows()>0){
$row = $res->row_array();
$bonus = $row['bonus'];
}
else{
$bonus = 0;
}
if($position[0] === "left"){
$abonus = $abonus + $bonus;
}
else if($position[0] === "right"){
$bbonus = $bbonus + $bonus;
}
$data = array('parentname'=>$temp[0]);
$this->db->select('name,position');
$res = $this->db->get_where('p_teams',$data);
if($res->num_rows()>0){
$row = $res->result_array();
$i=0;
foreach($row as $parent){
$temp1[$i] = $parent['name'];
$position1[$i] = $parent['position'];
$i = $i+1;
}
$temp = array_merge($temp,$temp1);
$position = array_merge($position,$position1);
}
else{
}
unset($temp[0],$position[0]);
$temp = array_values($temp);
$position = array_values($position);
echo "<pre>";
echo "abonus:".$abonus." bbonus:".$bbonus." name:".$temp[0];
echo "</pre>";
}
}
}
else{
}
}
那么,解决此类问题的最佳方法是什么以及如何处理大量数据?
答案 0 :(得分:1)
我对您的数据结构知之甚少。我仍然建议使用连接并在存储过程/视图的帮助下将其从Codeigniter中取出(我更喜欢在您的情况下使用视图)。使用它,您还可以消除复杂性并提高性能