考虑到以下事实,我想分发每个代理商佣金的价值:
assigned_commission表的结构(我存储我需要分配的佣金):
commission_type | assigned_value | agent_class
energy_type_1 | 1500 | CLASS_1
energy_type_2 | 250 | CLASS_1
energy_type_3 | 750 | GENERAL_CLASS
agent_allocation的结构:
agent_code | agent_class
AGENT_1 | CLASS_1
AGENT_2 | CLASS_1
AGENT_3 | CLASS_2
AGENT_1 | GENERAL_CLASS
AGENT_2 | GENERAL_CLASS
AGENT_3 | GENERAL_CLASS
这是我写的代码:
$stmt_assigned_commission = $conn_bd->prepare('select * from assigned_commission ');
$stmt_comisioane_repartizate->execute(array());
$result_stmt_assigned_commission = $stmt_assigned_commission ->fetchAll();
if ( count($result_stmt_assigned_commission ) ) {
foreach($result_stmt_assigned_commission as $row_assigned_commission ) {
$commission_type[] = $row_assigned_commission ['commission_type'];
$assigned_value[] = $row_assigned_commission ['assigned_value'];
$agent_class[] = $row_assigned_commission ['agent_class'];
}
} else {
$commission_type = 0;
$assigned_value = 0;
$agent_class = 0;
}
$count_assigned_commission = count($commission_type);
$i = 0;
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[] = $row_agent_distribution['agent_code'];
}
} else {
$agent_distribution = 0;
}
$count_agent_distribution = count($agent_distribution);
$j = 0;
while ($j < $count_agent_distribution) {
$stmt_calculate->bindValue(':agent_code', $agent_distribution[$j]);
$stmt_calculate->bindValue(':commission_type', $commission_type[$i]);
$stmt_calculate->bindValue(':assigned_value', $assigned_value[$i]);
$stmt_calculate->execute();
$j++;
}
$i++;
}
结果:
agent_code | commission_type | assigned_value
AGENT_1 | energy_type_1 | 1500
AGENT_1 | energy_type_2 | 250
AGENT_1 | energy_type_2 | 250
AGENT_1 | energy_type_3 | 750
AGENT_1 | energy_type_3 | 750
AGENT_1 | energy_type_3 | 750
AGENT_2 | energy_type_1 | 1500
AGENT_2 | energy_type_2 | 250
AGENT_2 | energy_type_2 | 250
AGENT_2 | energy_type_3 | 750
AGENT_2 | energy_type_3 | 750
AGENT_2 | energy_type_3 | 750
AGENT_3 | energy_type_3 | 750
它应该返回什么:
agent_code | commission_type | assigned_value
AGENT_1 | energy_type_1 | 1500
AGENT_1 | energy_type_2 | 250
AGENT_1 | energy_type_3 | 750
AGENT_2 | energy_type_1 | 1500
AGENT_2 | energy_type_2 | 250
AGENT_2 | energy_type_3 | 750
AGENT_3 | energy_type_3 | 750
答案 0 :(得分:0)
任何时候你在循环中进行查询,你都可以在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次(第1次while ($i < $count_assigned_commission )
循环),4次(第2次while ($i < $count_assigned_commission )
循环),然后是7次(第3次{ {1}}循环)。
所以它最终会像这样 -
while ($i < $count_assigned_commission )
实际更正
所以你需要在每个循环上创建一个'new'$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
我仍然推荐JOIN查询,因为每当你在循环中进行循环时,你很容易出现这种类型的错误,然后你的结果很快就会扩展而不知道原因。