0

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

  • 我可以有“n”个佣金
  • 佣金分配在代理类别上,一个代理可以是多个类别的一部分

assign_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
4

1 回答 1

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 结果截图


编辑

因此,这里快速回顾一下为什么会发生重复。每次通过你的时候,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 查询,因为任何时候你在一个循环中执行一个循环,你很容易犯这种类型的错误,然后你的结果会在不知道为什么的情况下迅速扩展。

于 2013-05-25T18:35:54.943 回答