MySQL - 从周开始日期选择数周的数据

时间:2015-04-10 14:15:59

标签: mysql sql select

尝试做一个选择,但似乎无法掌握这个特定的艺术。 这就是我的尝试:

select user_id,date,monday_am_task from users,week,timesheet_submission where user_id='1' and date='2015-04-06'; 

然而它说这太模糊了。这基本上就是我想要做的。如果user_id = 1且日期在2015-04-06之间,则显示数据。在我和我之间的日期之间,我设置了一个星期表,其中包括week_number,week_id和date。日期称为开始日期。因此,对于我的select语句,我试图选择将拉出该周所有数据的日期,如果这有意义的话?

周表:

mysql> select * from week;
+---------+------+------------+
| week_id | week | date       |
+---------+------+------------+
|       1 | 1    | 2014-12-29 |
|       2 | 2    | 2015-01-05 |
|       3 | 3    | 2015-01-12 |
|       4 | 4    | 2015-01-19 |
|       5 | 5    | 2015-01-26 |
|       6 | 6    | 2015-02-02 |
|       7 | 7    | 2015-02-09 | etc... 

用户:

mysql> select user_id, username, level from users;
+---------+----------+-------+
| user_id | username | level |
+---------+----------+-------+
|       1 | tom      |     1 |
|       2 | owain    |     2 |
+---------+----------+-------+
2 rows in set (0.00 sec)

mysql> select user_id, date, timesheet_id, monday_am_task from timesheet_submission;
+---------+---------------------+--------------+----------------+
| user_id | date                | timesheet_id | monday_am_task |
+---------+---------------------+--------------+----------------+
|       1 | 2015-04-10 12:44:54 |           34 |              5 |
+---------+---------------------+--------------+----------------+
1 row in set (0.00 sec)

1 个答案:

答案 0 :(得分:0)

当一个或多个所选表中存在列名时,会发生此错误。在这种情况下,它似乎是user_id,因为它同时位于用户和timesheet_submission中。

此外,尽管这是个人偏好,但许多人更喜欢使用JOIN语法,而不是在FROM子句中列出多个表。第二个选项创建了一个笛卡尔积,这是您正在经历的,除非您设置相关表的适当条件,否则您可能得到非常奇怪的结果,就像您现在拥有的那样。

简而言之,连接语法可能如下所示:

SELECT [columns]
FROM table1 t1
JOIN table2 t2 ON t2.relatedColumn = t1.relatedColumn;

对于你的表,你可以将用户加入到timesheet_submission,将timesheet_submission加入到一周,虽然那个是棘手的,因为没有直接的链接。为了稍微打破我的答案,我首先要通过这样的连接获取user_id 1的所有时间表提交:

SELECT u.user_id, ts.date, ts.monday_am_task
FROM users u
JOIN timesheet_submission ts ON ts.user_id = u.user_id AND u.user_id = 1;

不要忘记在select中使用表别名,否则会再次出现歧义错误。至于日期,如果我写这个查询,我只会包括条件,时间表日期在你的给定日期和六天之后[因为之间是包容性的,如果你去七天后你会得到下一个日期以及]。试试这个:

SELECT u.user_id, ts.date, ts.monday_am_task
FROM users u
JOIN timesheet_submission ts ON ts.user_id = u.user_id AND u.user_id = 1
WHERE ts.date BETWEEN '2015-04-06' AND DATE_ADD('2015-04-06', INTERVAL 6 DAY);

JOINS以及DATE_ADD函数的更多内容。