这看起来应该很容易,但我的头撞到了墙上。我正在用php/mysql创建一个站点,当用户打开一周中的某一天时,它会列出分配给他们的任务,按时间块分组,例如8-11,11-14等。
我有一个这样的表,其中的字段旨在引用另一个包含任务的表。每个整数对应于tasks表中的唯一任务。
8-11 11-14 14-17 17-20 20-23
Mon 1 3 4 1 2
Tues 1,3 4 5 6 7
Wed 1,2,3 5 4 8 9
正如你所看到的,有些日子在不同的时间有重复的任务(例如,在周一,任务1在8-11和17-20时段执行)。最让我困惑的是如何设置表或连接多个表来处理具有多个任务的时隙,例如,Wed 8-11班次有三个任务,1,2和3。
我的问题是:您能否建议最适合这一点的表结构,以及检索给定日期任务的示例查询?谢谢。任何帮助都是非常感谢的。
**编辑**这是我想问的:看看Wed 8-10,我如何从任务表中拉出这三个任务?
发布于 2012-09-18 08:58:46
http://sqlfiddle.com/#!2/2130b/8
CREATE TABLE work_periods (work_period_id int unsigned, weekday int unsigned, description varchar(50));
CREATE TABLE tasks (task_id int unsigned, description varchar(50));
CREATE TABLE work_period_task_assignments (work_period_id int unsigned, task_id int unsigned);
INSERT INTO work_periods VALUES (1, 1, 'Mon 8-11'), (2, 1, 'Mon 11-14'), (3, 1, 'Mon 14-17');
INSERT INTO tasks VALUES (1, 'Drink Coffee'), (2, 'Make Toast'), (3, 'Do Work');
INSERT INTO work_period_task_assignments VALUES (1, 1), (1, 2), (2,3), (3,3);
SELECT p.description as period, t.description as task FROM work_periods p
INNER JOIN work_period_task_assignments wpta
ON wpta.work_period_id = p.work_period_id
INNER JOIN tasks t
ON wpta.task_id = t.task_id
WHERE p.weekday = 1;
发布于 2012-09-18 08:31:11
这样如何:
period (id, desc, start_hour, end_hour), e.g. "8-11"
task (id, desc), e.g. "Task 1")
period_task (period_id, task_id)
因此,任务1在period_task中有三行。
发布于 2012-09-18 08:34:15
对于结构,您可以使用单个指配表:
CREATE TABLE assignments (
assignment_id int AUTO_INCREMENT PRIMARY KEY,
user int,
dt datetime,
assignment_name varchar(50))
然后,可以使用CASE
对工作分配的数量进行分组。下面是一些伪代码:
SELECT timeRange, COUNT(*) AS assignments
FROM
(SELECT
CASE
WHEN HOUR(dt) BETWEEN 8 AND 11 THEN '8-11'
WHEN HOUR(dt) BETWEEN 11 AND 14 THEN '11-14'
WHEN HOUR(dt) BETWEEN 14 AND 17 THEN '14-17'
WHEN HOUR(dt) BETWEEN 17 AND 20 THEN '17-20'
WHEN HOUR(dt) BETWEEN 20 AND 23 THEN '10-23'
END AS timeRange
FROM assignments) t
GROUP BY t.timeRange
您可以根据需要添加条件以按user
和date
范围进行过滤。
https://stackoverflow.com/questions/12468821
复制相似问题