0

私の Symfony2/Doctrine2 アプリケーションでは、特定の日に特定のアクションを行った場合に、すべてのユーザーを追跡するデータベース内にエンティティとテーブルがあります。

私のテーブルはそのように見えます、それを呼びましょうtrack_user_action

+---------+------------+
| user_id | date       |
+---------+------------+
|       1 | 2013-09-19 |
|       2 | 2013-09-19 |
|       1 | 2013-09-18 |
|       5 | 2013-09-18 |
|       8 | 2013-09-17 |
|       5 | 2013-09-17 |
+---------+------------+

過去 30 日間、対応する曜日、および指定されたユーザーがこのテーブルにエントリを持っているかどうかを示す一連の行を取得したいと思いますuser_id = 1

+------------+--------------+-----------------+
| date       | weekday      | has_done_action |
+------------+--------------+-----------------+
| 2013-09-20 | Friday       | false           |
| 2013-09-19 | Thursday     | true            |
| 2013-09-18 | Wednesday    | true            |
| ...        |              |                 |
| 2013-08-20 | Tuesday      | false           |
+------------+--------------+-----------------+

LEFT JOIN日付テーブルの と私のtrack_user_action. しかし、日付のためだけに特別なテーブルを作成するのは無意味に思えます。MySQL は日々を処理できるはずですよね?

アプローチ:

SELECT
  # somehow retrieve last 30 days
  date AS date,
  DAYNAME(date) AS weekday,
  IF ... THEN has_done_action = true ELSE has_done_action = false
  # and according weekdays
LEFT JOIN track_user_action AS t
  ON t.date = # date field from above
WHERE t.user_id = 1
ORDER BY # date field from above
  DESC
LIMIT 0,30

私の質問:

  • この種の結果を取得する適切な (My)SQL クエリは何でしょうか?
  • このクエリは Doctrine2 でどこまで実装可能ですか (Doctrine2 がすべての MySQL ステートメント、たとえばYEAR()orをサポートしているわけではないことを私は知っていますMONTH())?
4

1 に答える 1

1

これは、7 日間の作業クエリ ステートメントです (それに応じて 30 日間のクエリを調整します)。

SELECT
    d.date AS date,
    DAYNAME(d.date) AS weekday,
    IF(t.user_id IS NOT NULL, 'true', 'false') AS has_done_action
FROM (
    SELECT SUBDATE(CURDATE(), 1) AS date UNION
    SELECT SUBDATE(CURDATE(), 2) AS date UNION
    SELECT SUBDATE(CURDATE(), 3) AS date UNION
    SELECT SUBDATE(CURDATE(), 4) AS date UNION
    SELECT SUBDATE(CURDATE(), 5) AS date UNION
    SELECT SUBDATE(CURDATE(), 6) AS date UNION
    SELECT SUBDATE(CURDATE(), 7) AS date
    ) AS d
LEFT JOIN track_user_action t
ON t.date = d.date
于 2013-09-20T12:32:25.637 に答える