2013-04-24 10 views
0

foreach 루프 내에서 MySQL 쿼리를 실행했지만 이제 쿼리를 먼저 실행 한 다음 배열을 반복하는 것이 더 효율적이라는 것을 알게되었습니다. 나는 3 개의 테이블에있는 데이터를 사용하여 Google 그래프를 구성하는 코드를 최적화 할 수 있는지 궁금합니다. 예를 들어 foreach 루프에 where 절을 추가하여 각 루프 내에 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

나는 당신의 마지막 줄을 이해하지 않는다 :'$ 행 [] = 배열 ​​('C'를 = > $ temp); ', 당신은 여기서 무엇을하려고합니까? – Revent

답변

0

왜 당신을 위해 데이터베이스를 만들지 않습니까? WHERE 문에 날짜 기준을 추가하면됩니다.

1

좋은 MySQL 쿼리 만 수행하면됩니다.

here을 참조하십시오.

date BETWEEN x AND Y 등의 덧셈, 뺄셈 등을 수행 할 수 있으며 SELECT SUM()GROUP BY 등과 같이 수행 할 수 있습니다.

하칸이 의미하는 바는 (내가 생각하기에) 잘못된 길을 걷고 있다는 것입니다. 먼저 거의 모든 작업을 수행하는 쿼리를 만들어야합니다. 복잡한 것을 개발할 필요가 없습니다.

그리고 다른 세 조언 : $expense->Date처럼 PHP에서 키워드를 피하기 위해

  • 시도. 이로 인해 구문 강조 표시 문제가 발생합니다 ( 경우, 최악의 경우 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' 
관련 문제