明確にするために、1つのフィールドに2つの参照を含めることはできないため、相互参照を保持するためにテーブルを使用します...つまり、daily_tasksでは、1日のタイムスロットごとに必要な数のアイテムを挿入できます。制限は、1つのタイムスロットで同じタスクを2回実行することはできないということですが、主キー宣言を削除すれば、それでも削除できます。
create table task(
id tinyint unsigned not null auto_increment primary key,
name text not null
) engine InnoDB;
create table timeslot(
id int unsigned not null auto_increment primary key,
date date not null,
time tinyint unsigned not null
) engine InnoDB;
create table daily_tasks(
timeslot int unsigned not null,
task tinyint unsigned not null,
foreign key(timeslot) references timeslot(id) on update cascade on delete cascade,
foreign key(task) references task(id) on update cascade on delete cascade,
primary key(timeslot,task)
) engine InnoDB;
いくつかのサンプルデータを挿入します
insert into task (name) values ('wake up'), ('wash'), ('eat'), ('drink'), ('go to work'), ('do some work');
insert into timeslot (date, time) values ('2012-09-18', 8), ('2012-09-18', 11), ('2012-09-18', 14), ('2012-09-18', 17), ('2012-09-18', 20);
insert into daily_tasks values (1, 1), (1,3), (1,4), (1,5), (2,6), (3,6), (4,3), (4,4), (4,2);
1日のすべてのタスクを選択するには
select timeslot.time, task.name from timeslot join daily_tasks on daily_tasks.timeslot = timeslot.id join task on task.id = daily_tasks.task where timeslot.date = '2012-09-18' order by timeslot.time asc;
クエリ結果
+------+--------------+
| time | name |
+------+--------------+
| 8 | wake up |
| 8 | eat |
| 8 | drink |
| 8 | go to work |
| 11 | do some work |
| 14 | do some work |
| 17 | wash |
| 17 | eat |
| 17 | drink |
+------+--------------+
9 rows in set (0.00 sec)
連結されたタスクを使用した代替クエリ
select timeslot.time, group_concat(task.name) from timeslot join daily_tasks on daily_tasks.timeslot = timeslot.id join task on task.id = daily_tasks.task where timeslot.date = '2012-09-18' group by timeslot.time asc;
その結果
+------+------------------------------+
| time | group_concat(task.name) |
+------+------------------------------+
| 8 | wake up,eat,drink,go to work |
| 11 | do some work |
| 14 | do some work |
| 17 | wash,eat,drink |
+------+------------------------------+
4 rows in set (0.01 sec)
どうやらすべての間隔は3時間の長さなので、時間に3を加えることで計算できるため、タスクの終了時間を含めませんでした。