我正在使用下面的代碼來構建一個Google圖表,以便在一年內對應於一週數字的MySQL表格中提取所有條目。目前,週數開始於星期天,我想改變這一點,以便他們在星期一開始,但我不知道如何做到這一點。如何在PHP/MySQL中使用Week(Date)時將星期幾的第一天設置爲星期一?
$i=1;
while($i<=53)
{
$week_start = new DateTime();
$week_start->setISODate(2013,$i+1);
$date_display = $week_start->format('j M Y');
$sessions = $wpdb->get_var($wpdb->prepare("SELECT Sum(Due) from patient_sessions WHERE Type='Session' AND Week(Date)='$i'"));
$temp = array();
$temp[] = array('v' => (string) $date_display);
$temp[] = array('v' => (string) $sessions);
$rows[] = array('c' => $temp);
$i++;
}
修改後的代碼
$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'"));
$i=1;
while($i<=53) {
$week_start = new DateTime();
$week_start->setISODate(2013,$i+1);
$date_display = $week_start->format('j M Y');
$session_total = 0;
$work_time_total = 0;
$expense_total = 0;
foreach ($sessions as $session) {
if (date("W", strtotime($session->Date)) == $i) {
$session_total = ($session_total+$session->Due);
}
}
foreach ($work_times as $work_time) {
if (date("W", strtotime($work_time->Date)) == $i) {
$work_time_total = ($work_time_total+$work_time->Amount);
}
}
foreach ($expenses as $expense) {
if (date("W", strtotime($expense->Date)) == $i) {
$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);
$i++;
}
這似乎是一個非常低效的做法!只需一次獲取所有結果,然後遍歷結果集。 – Strawberry 2013-04-24 16:11:49
@Strawberry你可能是對的。你的意思是使用'來自patient_sessions的SELECT *',然後使用循環遍歷所有結果?我注意到圖表加載速度很慢。據推測這是爲什麼?一般情況下,PHP循環的運行速度比以上述方式使用查詢快嗎? – Nick 2013-04-24 17:06:02
通常(當然也有例外),您希望儘可能少地往返數據庫。你的策略使53次旅行。我做了1.但是,問題不在於「SELECT *」。這是「WHERE Week(Date)='$ i'」。請參閱GROUP BY。 – Strawberry 2013-04-25 08:35:51