首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在一个字段中包含两个引用的mysql结构

在一个字段中包含两个引用的mysql结构
EN

Stack Overflow用户
提问于 2012-09-18 08:22:23
回答 4查看 57关注 0票数 0

这看起来应该很容易,但我的头撞到了墙上。我正在用php/mysql创建一个站点,当用户打开一周中的某一天时,它会列出分配给他们的任务,按时间块分组,例如8-11,11-14等。

我有一个这样的表,其中的字段旨在引用另一个包含任务的表。每个整数对应于tasks表中的唯一任务。

代码语言:javascript
运行
复制
       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,我如何从任务表中拉出这三个任务?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-18 08:58:46

http://sqlfiddle.com/#!2/2130b/8

代码语言:javascript
运行
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2012-09-18 08:31:11

这样如何:

代码语言:javascript
运行
复制
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中有三行。

票数 0
EN

Stack Overflow用户

发布于 2012-09-18 08:34:15

对于结构,您可以使用单个指配表:

代码语言:javascript
运行
复制
CREATE TABLE assignments (
  assignment_id int AUTO_INCREMENT PRIMARY KEY,
  user int,
  dt datetime,
  assignment_name varchar(50))

然后,可以使用CASE对工作分配的数量进行分组。下面是一些伪代码:

代码语言:javascript
运行
复制
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

您可以根据需要添加条件以按userdate范围进行过滤。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12468821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档