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

标签 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 和日期。日期是指一周的开始日期。因此,通过我的 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)

最佳答案

当列名存在于一个或多个选定表中时,会发生此错误。在本例中,它似乎是 user_id,因为它同时存在于 users 和 timesheet_submission 中。

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

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

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

对于您的表格,您可以将用户加入到 timesheet_submission,并将 timesheet_submission 加入到 week,尽管这很棘手,因为没有直接链接。为了稍微分解一下我的答案,我首先使用如下连接获取 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 中使用表别名,否则您将再次收到歧义错误。就日期而言,如果我编写此查询,我只会包含以下条件:时间表日期介于给定日期和六天后之间[因为之间包含在内,如果您在 7 天后去,您将获得下一个日期以及]。试试这个:

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上功能。

关于MySQL - 从一周开始日期选择一周的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29563768/

相关文章:

php - 从两个表中选择交替记录

mysql - 连接池是在单个服务器(使用 MySQL)上运行多个应用程序实例的最佳方式吗?

mysql - 如果 Update row_count()=0 则插入

mysql - 从查找表中获取每个类型和每个日期的最大 ID

php - 选择字段内包含用户 ID 的 mysql 行

php - 使用搜索/分页将大型 MYSQL 结果显示到表中的最佳方法是什么?

mysql - 不能在mysql workbench中使用datetime类型

mysql - 如何预测在给定数据库结构和给定表大小下完成 SQL 请求所需的资源?

javascript - Bootstrap - 如何在 JavaScript 中动态添加 <select class ="form-control">?

mysql - 选择多个表时出错