0

これまで foreach ループ内で MySQL クエリを実行してきましたが、最初にクエリを実行してから配列を反復処理する方が効率的であることに気付きました。以下のコード (3 つのテーブルのデータを使用して Google グラフを作成する) をさらに最適化できるかどうか疑問に思っています。たとえば、foreach ループに where 句を追加して、各ループ内に if 句を含める必要がないようにすることは可能ですか?

$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);
}
4

2 に答える 2

1

適切な MySQL クエリを実行するだけで済みます。

ここを参照してください。

足し算、引き算、などを行うことができ、aで aをdate BETWEEN x AND Y行うことができます。SELECT SUM()GROUP BY

Hakan が意味することは (私が推測するに)、あなたのやり方が間違っているということです。最初に、ほとんどすべての作業を行うクエリを実行する必要があります。そのような複雑なものを開発する必要はありません。

その他の 3 つのアドバイス:

  • のような PHP のキーワードを避けるようにしてください$expense->Date。これにより、構文の強調表示の問題が発生します (最良の場合、最悪の場合、 Php はコードを理解できません)。
  • コードにコメントを追加して、何をしようとしているのかを説明してください。
  • Php AND 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'
于 2014-05-28T08:30:09.433 に答える
0

データベースに if を任せてみませんか? つまり、WHERE ステートメントに日付条件を追加するということです。

于 2013-04-24T22:04:38.800 に答える