金额按几个标准分配

时间:2013-05-25 17:00:13

标签: php

考虑到以下事实,我想分发每个代理商佣金的价值:

  • 我可以拥有" n"佣金数量
  • 佣金在代理类上分配,一个代理可以是多个类的一部分

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

1 个答案:

答案 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

结果 - sqlfiddle results screenshot


修改

所以这里是一个快速回顾你的副本发生的原因。每次通过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查询,因为每当你在循环中进行循环时,你很容易出现这种类型的错误,然后你的结果很快就会扩展而不知道原因。