2013-04-24 63 views
0

直到现在,我一直在foreach循环中运行MySQL查询,但现在认识到先运行查询然后遍历数组会更高效。我想知道是否可以优化下面的代码 - 使用3个表中的数据构建Google图表 - 进一步。是否有可能例如添加一个where子句到foreach循环,以便我不需要在每个循环中包含if子句?使用foreach循环优化迭代遍历数组

$begin = new DateTime(date('Y-m-d', strtotime('-28 days'))); 
$end = new DateTime(date('Y-m-d', strtotime('+1 day'))); 
$interval = DateInterval::createFromDateString('1 day'); 
$period = new DatePeriod($begin, $interval, $end); 

$sessions = $wpdb->get_results($wpdb->prepare("SELECT Due,Date from patient_sessions WHERE Type='Session'")); 
$work_times = $wpdb->get_results($wpdb->prepare("SELECT Amount,Date from work_times")); 
$expenses = $wpdb->get_results($wpdb->prepare("SELECT Amount,Date from expenses WHERE Client='Psychotherapy'")); 

foreach ($period as $dt) { 

    $session_total = 0; 
    $work_time_total = 0; 
    $expense_total = 0; 

    $date = $dt->format("Y-m-d"); 
    $date_display = $dt->format("D j M"); 

    foreach ($sessions as $session) { 
     if (substr($session->Date,0,10) === $date) { 
      $session_total = ($session_total+$session->Due); 
     } 
    } 

    foreach ($work_times as $work_time) { 
     if ($work_time->Date === $date) { 
      $work_time_total = ($work_time_total+$work_time->Amount); 
     } 
    } 

    foreach ($expenses as $expense) { 
     if ($expense->Date === $date) { 
      $expense_total = ($expense_total+$expense->Amount); 
     } 
    } 

    $balance = ($session_total + $work_time_total - $expense_total); 

    $temp = array(); 

    $temp[] = array('v' => (string) $date_display); 
    $temp[] = array('v' => (string) $balance); 
    $rows[] = array('c' => $temp); 
} 
+1

我不明白你的最后一行:'$ rows [] = array('c'= > $ temp);',你想在这里做什么? – Revent 2013-04-24 19:51:13

回答

0

为什么你不让数据库做你的?我的意思是把日期标准添加到WHERE语句中。

1

你只需要做一个很好的MySQL查询。

请参阅here

您可以添加,减少和诸如date BETWEEN x AND Y之类的东西,您可以使用GROUP BY等等来执行SELECT SUM()

哈坎的含义是什么(我猜)是你做错了:你应该先做一个查询,为你做几乎所有的工作。没有必要开发这样复杂的东西。

而其他三个建议:

  • 尽量避免关键字在Php像$expense->Date。这使得语法突出显示问题(在最好的的情况下,在最糟糕的 Php不会理解你的代码)。
  • 在您的代码中添加更多注释以解释您正在尝试执行的操作。
  • 尽量避免关键字在Php SQL查询。您有一个名为'Date'的列和一个名为'Type'的列。这不安全。

这只是你的SQL看起来像什么的开始,它几乎应该覆盖95%的代码。注意:这是一个建议:让所有的数据库服务器为你做这个工作,这是为了做到这一点:

SELECT 
    ps.Due,ps.Date, 
    wt.Amount,wt.Date, 
    ex.Amount,ex.Date 

LEFT JOIN patient_sessions ps 
    ON xxx 
    WHERE ps.Type='Session' 
    AND ps.Date 
     BETWEEN DATE_ADD(NOW(), INTERVAL '-28' DAY) 
     AND  DATE_ADD(NOW(), INTERVAL 1 DAY) 
LEFT JOIN work_times wt 
    ON xxx 
LEFT JOIN expenses ex 
    ON xxx 
    WHERE ex.Client='Psychotherapy'