1

曜日ごとに請求される時間数を示す次のクエリがあります

SELECT DAYNAME(record_date),
      sum(value)
FROM acx_time_records
WHERE
  acx_time_records.state = 3
  AND record_date >= '2012-10-1' AND record_date <= '2012-10-7'    
  AND user_id = 7 
  GROUP BY
  dayname(acx_time_records.record_date)
  ORDER BY weekday(acx_time_records.record_date)

上記のクエリは、次の結果を出力します。

Tuesday    9.75
Friday     1

私が抱えている問題は、X 軸が各曜日として既に定義されているグラフに値をプロットする必要があることです。

 Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday

したがって、結果に表示される特定の曜日/時間だけでなく、曜日ごとに結果を渡す必要があります。各カレンダーの曜日と日のインデックスを持つ新しいテーブルに結合することを考えましたが、それがどのように可能になるかわかりません。理想的な出力は次のようになります。

Monday    0
Tuesday   9.75
Wednesday 0
Thursday  0
Friday    1
Saturday  0
Sunday    0

これを達成する方法についてのヒントや提案をいただければ幸いです。これは、MySQL と PHP を組み合わせることによっても容易になる可能性があることはわかっていますが、可能であれば MySQL のみを必要とする方法でこれを実行しようとしています。

4

2 に答える 2

2

LEFT JOIN を使用したソリューション。

newfurniturey が提案したように、追加のテーブルを使用するか、UNION でいくつかの SELECT を使用できます。また、結合されたテーブル内に WHERE フィルターを配置しました。

CREATE TABLE week_days(
  week_day_num INT(11) DEFAULT NULL
);

INSERT INTO week_days(week_day_num) VALUES (1),(2),(3),(4),(5),(6),(7);

SELECT
  DAYNAME(atrrecord_date),
  SUM(atr.value),
  COALESCE(SUM(atr.value) , 0)
FROM week_days wd
  LEFT JOIN (
      SELECT * FROM acx_time_records
      WHERE
        acx_time_records.state = 3
        AND record_date >= '2012-10-1' AND record_date <= '2012-10-7'    
        AND user_id = 7 
    ) atr
    ON wd.week_day_num = DAYOFWEEK(atr.record_date)
GROUP BY
  DAYOFWEEK(atr.record_date);
于 2012-10-09T05:27:54.423 に答える
1

LEFT JOIN実際には、別のテーブルに参加するという最初のアイデアを使用することをお勧めしますが、句を使用して単純なエイリアステーブルにすることができます。

SELECT
    days.day,
    IF (value IS NULL, 0, SUM(value))
FROM
    (SELECT 'Monday' AS day UNION SELECT 'Tuesday' UNION SELECT 'Wednesday' UNION SELECT 'Thursday' UNION SELECT 'Friday' UNION SELECT 'Saturday' UNION SELECT 'Sunday') AS days
    LEFT JOIN (
        SELECT * FROM acx_time_records
        WHERE 
            acx_time_records.state = 3
            AND record_date >= '2012-10-1' AND record_date <= '2012-10-7'    
            AND user_id = 7 
    ) AS acx_time_records
        ON DAYNAME(record_date) = days.day
GROUP BY
    days.day
ORDER BY weekday(acx_time_records.record_date)

これにより、すべての曜日が (個々の行として) 選択され、曜日が定義されていない場合は、SUM()for each0がそれに応じてグループ化されます。

于 2012-10-09T03:52:04.773 に答える