任何时候你在循环中进行查询,你都可以在 MySQL JOIN 中做同样的事情
SELECT
a.agent_code, c.commission_type, c.assigned_value
FROM
agent_allocation a
JOIN
assigned_commission c
ON
a.agent_class = c.agent_class
ORDER BY
a.agent_code, c.commission_type
现在您的代码可以简化为-
$stmt_assigned_commission = $conn_bd->prepare('SELECT a.agent_code, c.commission_type, c.assigned_value FROM agent_allocation a JOIN assigned_commission c ON a.agent_class = c.agent_class ORDER BY a.agent_code, c.commission_type');
$stmt_assigned_commission->execute();
$result_stmt_assigned_commission = $stmt_assigned_commission->fetchAll();
if (count($result_stmt_assigned_commission)) {
foreach($result_stmt_assigned_commission as $row) {
echo $row['agent_code'];
echo $row['commission_type'];
echo $row['assigned_value'];
}
}
else{
//
}
看到这个 sqlfiddle - http://sqlfiddle.com/#!2/dcbcd/5
结果——
编辑
因此,这里快速回顾一下为什么会发生重复。每次通过你的时候,while ($i < $count_assigned_commission )
你都在添加新的值而$agent_distribution[]
不是替换以前的值,所以它基本上是这样做的 -
// 1st loop
$agent_distribution[] = array("agent_code"=>"AGENT_1"); // New
$agent_distribution[] = array("agent_code"=>"AGENT_2"); // New
// 2nd loop
$agent_distribution[] = array("agent_code"=>"AGENT_1"); // From 1st Loop
$agent_distribution[] = array("agent_code"=>"AGENT_2"); // From 1st Loop
$agent_distribution[] = array("agent_code"=>"AGENT_1"); // New
$agent_distribution[] = array("agent_code"=>"AGENT_2"); // New
// 3rd loop
$agent_distribution[] = array("agent_code"=>"AGENT_1"); // From 1st Loop
$agent_distribution[] = array("agent_code"=>"AGENT_2"); // From 1st Loop
$agent_distribution[] = array("agent_code"=>"AGENT_1"); // From 2nd Loop
$agent_distribution[] = array("agent_code"=>"AGENT_2"); // From 2nd Loop
$agent_distribution[] = array("agent_code"=>"AGENT_1"); // New
$agent_distribution[] = array("agent_code"=>"AGENT_2"); // New
$agent_distribution[] = array("agent_code"=>"AGENT_3"); // New
所以现在当你做决赛时,你while ($j < $count_agent_distribution)
做了 2 次(第 1while ($i < $count_assigned_commission )
循环),4 次(第 2while ($i < $count_assigned_commission )
循环),然后 7 次(第 3while ($i < $count_assigned_commission )
循环)。
所以结局是这样的——
$i = 0;
while ($i < $count_assigned_commission ) { // 3 Times
// first time
$stmt_agent_distribution = 'select agent_code from agent_allocation where agent_class = '.$agent_class[0];
$result_stmt_agent_distribution[] = array("agent_code"=>"AGENT_1");
$result_stmt_agent_distribution[] = array("agent_code"=>"AGENT_2");
if ( count($result_stmt_agent_distribution) ) {
foreach($result_stmt_agent_distribution as $row_agent_distribution) {
$agent_distribution[] = $row_agent_distribution['agent_code'];
}
}
$count_agent_distribution = count($agent_distribution); // 2
$j = 0;
while ($j < $count_agent_distribution) {
// first time
$stmt_calculate->bindValue(':agent_code', $agent_distribution[0]);
$stmt_calculate->bindValue(':commission_type', $commission_type[0]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[0]);
$stmt_calculate->execute();
$results[] = array("agent_code"=>"AGENT_1","commission_type"=>"energy_type_1","assigned_value"=>1500);
// second time
$stmt_calculate->bindValue(':agent_code', $agent_distribution[1]);
$stmt_calculate->bindValue(':commission_type', $commission_type[0]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[0]);
$stmt_calculate->execute();
$results[] = array("agent_code"=>"AGENT_2","commission_type"=>"energy_type_1","assigned_value"=>1500);
$j++;
}
// second time
$stmt_agent_distribution = 'select agent_code from agent_allocation where agent_class = '.$agent_class[1];
$result_stmt_agent_distribution[] = array("agent_code"=>"AGENT_1");
$result_stmt_agent_distribution[] = array("agent_code"=>"AGENT_2");
if ( count($result_stmt_agent_distribution) ) {
foreach($result_stmt_agent_distribution as $row_agent_distribution) {
$agent_distribution[] = $row_agent_distribution['agent_code'];
}
}
$count_agent_distribution = count($agent_distribution); // 4
$j = 0;
while ($j < $count_agent_distribution) {
// first time -- THIS IS A DUPLICATE AS IT IS FROM THE 1ST while ($i < $count_assigned_commission ) AND SHOULD NOT BE DONE AGAIN
$stmt_calculate->bindValue(':agent_code', $agent_distribution[0]);
$stmt_calculate->bindValue(':commission_type', $commission_type[1]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[1]);
$stmt_calculate->execute();
$results[] = array("agent_code"=>"AGENT_1","commission_type"=>"energy_type_2","assigned_value"=>250);
// second time -- THIS IS A DUPLICATE AS IT IS FROM THE 1ST while ($i < $count_assigned_commission ) AND SHOULD NOT BE DONE AGAIN
$stmt_calculate->bindValue(':agent_code', $agent_distribution[1]);
$stmt_calculate->bindValue(':commission_type', $commission_type[1]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[1]);
$stmt_calculate->execute();
$results[] = array("agent_code"=>"AGENT_2","commission_type"=>"energy_type_2","assigned_value"=>250);
// third time
$stmt_calculate->bindValue(':agent_code', $agent_distribution[2]);
$stmt_calculate->bindValue(':commission_type', $commission_type[1]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[1]);
$stmt_calculate->execute();
$results[] = array("agent_code"=>"AGENT_1","commission_type"=>"energy_type_2","assigned_value"=>250);
// fourth time
$stmt_calculate->bindValue(':agent_code', $agent_distribution[3]);
$stmt_calculate->bindValue(':commission_type', $commission_type[1]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[1]);
$stmt_calculate->execute();
$results[] = array("agent_code"=>"AGENT_2","commission_type"=>"energy_type_2","assigned_value"=>250);
$j++;
}
// third time
$stmt_agent_distribution = 'select agent_code from agent_allocation where agent_class = '.$agent_class[2];
$result_stmt_agent_distribution[] = array("agent_code"=>"AGENT_1");
$result_stmt_agent_distribution[] = array("agent_code"=>"AGENT_2");
$result_stmt_agent_distribution[] = array("agent_code"=>"AGENT_3");
if ( count($result_stmt_agent_distribution) ) {
foreach($result_stmt_agent_distribution as $row_agent_distribution) {
$agent_distribution[] = $row_agent_distribution['agent_code'];
}
}
$count_agent_distribution = count($agent_distribution); // 7
$j = 0;
while ($j < $count_agent_distribution) {
// first time -- THIS IS A DUPLICATE AS IT IS FROM THE 1ST while ($i < $count_assigned_commission ) AND SHOULD NOT BE DONE AGAIN
$stmt_calculate->bindValue(':agent_code', $agent_distribution[0]);
$stmt_calculate->bindValue(':commission_type', $commission_type[2]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[2]);
$stmt_calculate->execute();
$results[] = array("agent_code"=>"AGENT_1","commission_type"=>"energy_type_3","assigned_value"=>750);
// second time -- THIS IS A DUPLICATE AS IT IS FROM THE 1ST while ($i < $count_assigned_commission ) AND SHOULD NOT BE DONE AGAIN
$stmt_calculate->bindValue(':agent_code', $agent_distribution[1]);
$stmt_calculate->bindValue(':commission_type', $commission_type[2]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[2]);
$stmt_calculate->execute();
$results[] = array("agent_code"=>"AGENT_2","commission_type"=>"energy_type_3","assigned_value"=>750);
// third time -- THIS IS A DUPLICATE AS IT IS FROM THE 2ND while ($i < $count_assigned_commission ) AND SHOULD NOT BE DONE AGAIN
$stmt_calculate->bindValue(':agent_code', $agent_distribution[2]);
$stmt_calculate->bindValue(':commission_type', $commission_type[2]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[2]);
$stmt_calculate->execute();
$results[] = array("agent_code"=>"AGENT_1","commission_type"=>"energy_type_3","assigned_value"=>750);
// fourth time -- THIS IS A DUPLICATE AS IT IS FROM THE 2ND while ($i < $count_assigned_commission ) AND SHOULD NOT BE DONE AGAIN
$stmt_calculate->bindValue(':agent_code', $agent_distribution[3]);
$stmt_calculate->bindValue(':commission_type', $commission_type[2]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[2]);
$stmt_calculate->execute();
$results[] = array("agent_code"=>"AGENT_2","commission_type"=>"energy_type_3","assigned_value"=>750);
// fifth time
$stmt_calculate->bindValue(':agent_code', $agent_distribution[4]);
$stmt_calculate->bindValue(':commission_type', $commission_type[2]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[2]);
$stmt_calculate->execute();
$results[] = array("agent_code"=>"AGENT_1","commission_type"=>"energy_type_3","assigned_value"=>750);
// sixth time
$stmt_calculate->bindValue(':agent_code', $agent_distribution[5]);
$stmt_calculate->bindValue(':commission_type', $commission_type[2]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[2]);
$stmt_calculate->execute();
$results[] = array("agent_code"=>"AGENT_2","commission_type"=>"energy_type_3","assigned_value"=>750);
// seventh time
$stmt_calculate->bindValue(':agent_code', $agent_distribution[6]);
$stmt_calculate->bindValue(':commission_type', $commission_type[2]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[2]);
$stmt_calculate->execute();
$results[] = array("agent_code"=>"AGENT_2","commission_type"=>"energy_type_3","assigned_value"=>750);
$j++;
}
$i++;
实际修正
所以你需要$agent_distribution
在每个循环上创建一个“新”,所以改变 -
$agent_distribution[] = $row_agent_distribution['agent_code'];
...
$count_agent_distribution = count($agent_distribution);
...
$stmt_calculate->bindValue(':agent_code', $agent_distribution[$j]);
至
$agent_distribution[$i][] = $row_agent_distribution['agent_code'];
...
$count_agent_distribution = count($agent_distribution[$i]);
...
$stmt_calculate->bindValue(':agent_code', $agent_distribution[$i][$j]);
所以它现在看起来像
...
while ($i < $count_assigned_commission ) {
$stmt_agent_distribution = $conn_bd->prepare('select agent_code from agent_allocation
where agent_class = :agent_class');
$stmt_agent_distribution->execute(array('agent_class' => $agent_class[$i]));
$result_stmt_agent_distribution = $stmt_agent_distribution->fetchAll();
if ( count($result_stmt_agent_distribution) ) {
foreach($result_stmt_agent_distribution as $row_agent_distribution) {
$agent_distribution[$i][] = $row_agent_distribution['agent_code'];
}
} else {
$agent_distribution[$i] = 0;
}
$count_agent_distribution = count($agent_distribution[$i]);
$j = 0;
while ($j < $count_agent_distribution) {
$stmt_calculate->bindValue(':agent_code', $agent_distribution[$i][$j]);
$stmt_calculate->bindValue(':commission_type', $commission_type[$i]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[$i]);
$stmt_calculate->execute();
$j++;
}
$i++;
}
现在$agent_distribution
看起来像这样,并将删除重复的结果
// 1st loop
$agent_distribution[0][] = array("agent_code"=>"AGENT_1");
$agent_distribution[0][] = array("agent_code"=>"AGENT_2");
// 2nd loop - does not have the rows from the 1st loop
$agent_distribution[1][] = array("agent_code"=>"AGENT_1");
$agent_distribution[1][] = array("agent_code"=>"AGENT_2");
// 3rd loop - does not have the rows from the 1st and 2nd loops
$agent_distribution[2][] = array("agent_code"=>"AGENT_1");
$agent_distribution[2][] = array("agent_code"=>"AGENT_2");
$agent_distribution[2][] = array("agent_code"=>"AGENT_3");
我仍然推荐 JOIN 查询,因为任何时候你在一个循环中执行一个循环,你很容易犯这种类型的错误,然后你的结果会在不知道为什么的情况下迅速扩展。