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 回答