我有3个学生表,其中有students.id,students.name
一个名为students_classes的表,其中包含students_classes.students_id和students_classes.classes_id,用于将学生与他们的班级相关联。
一个名为class的表,它有class.id,class.title,class.begin,class.end和class.type。 class.type可以是A或B.
A没有什么特别之处,但是B意味着该类有分区,并且表中的时间实际上显示了第一个分区何时开始以及何时结束。
这是错误的,因为学生被分成每个班级的分部,我需要时间来自一个部门,而不是所有部门。
我考虑使用divison.id,division.begin,division.end和division.class_id创建另一个名为divisions的表作为class.id的外来。
现在我的问题是,我如何创建一个选择或条件来检查类和IF class.type是B,转到divisions并从那里花时间而不是从class.begin和class.end?< / p>
我执行&#34;分区之前的选择功能&#34;部分:
function select_classes($student_id)
{
$this->db->select('class.title as t, class.type as tp,
class.begin as b, class.end as e');
$this->db->from('class');
$this->db->join('students_classes', 'class.id = students_classes.class_id');
$this->db->join('students', 'students.id = students_classes.students_id');
$this->db->where('students.id', $student_id);
$query = $this->db->get();
if ($query->num_rows() >= 1) {
return $query->result();
}
}
这样做取得了学生的身份,并返回他所拥有的课程以及在什么时间。我现在希望它也考虑到class.type是否为B,如果是,它应该加入divisions表并从中获取时间而不是类表。
还可以让它返回改变的开始/结束时间(如果它使用除法表)作为b和e像起始标准一样吗? (因为我把它们称为类 - &gt; b,类 - >视图中的e)
PS:我还假设students_classes中会有一个新的students_classes.division_id列,以便将学生与各自的部门联系起来,因为students_classes用于将学生与他们的班级联系起来......
答案 0 :(得分:0)
1)将students_classes
保留在2个不同的表中不是一个不错的选择。
2)假设类型A在某个特定的区域中(对于所有A&#39;同样)。
3)现在收集一个表中的所有课程及其部门和所有时间(基本上所有可能的组合),并将您的| id | name |
|----|-----------|
| 1 | Student1 |
| 2 | Student2 |
| 3 | Student3 |
| 4 | Student4 |
| 5 | Student5 |
| 6 | Student6 |
| 7 | Student7 |
| 8 | Student8 |
| 9 | Student9 |
| 10 | Student10 |
表链接到它。
将您的架构重新定义为 (SQL Fiddle) ,
1) 学生
| id | title | type |
|----|--------|------|
| 1 | class1 | A |
| 2 | class2 | B |
| 3 | class3 | B |
| 4 | class4 | A |
| 5 | class5 | A |
| 6 | class6 | A |
| 7 | class7 | B |
2) 班级
| id | title |
|----|-------|
| 1 | div1 |
| 2 | div2 |
| 3 | div3 |
3) divisions
| id | class_id | division_id | begin | end |
|----|----------|-------------|-------|-------|
| 1 | 1 | 1 | 07:30 | 13:30 |
| 2 | 2 | 1 | 08:30 | 14:30 |
| 3 | 2 | 2 | 08:00 | 14:00 |
| 4 | 3 | 2 | 07:00 | 12:00 |
| 5 | 3 | 3 | 06:30 | 11:30 |
| 6 | 4 | 1 | 07:15 | 12:15 |
| 7 | 5 | 1 | 06:20 | 12:20 |
| 8 | 6 | 1 | 06:50 | 12:50 |
| 9 | 6 | 1 | 07:50 | 13:50 |
| 10 | 6 | 2 | 08:50 | 14:50 |
| 11 | 6 | 3 | 09:50 | 15:50 |
4) classes_divisions
| id | student_id | class_division_id |
|----|------------|-------------------|
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 2 |
| 4 | 4 | 3 |
| 5 | 5 | 4 |
| 6 | 6 | 5 |
| 7 | 7 | 6 |
| 8 | 8 | 6 |
| 9 | 9 | 6 |
| 10 | 10 | 7 |
5) students_classes
JOIN
现在是一个简单的student_id
,只知道SELECT classes.title AS t,
classes.type AS tp,
classes_divisions.begin AS b,
classes_divisions.end AS e
FROM students_classes
JOIN classes_divisions
ON students_classes.class_division_id = classes_divisions.id
JOIN classes
ON classes_divisions.class_id = classes.id
WHERE students_classes.student_id = 2;
,
| t | tp | b | e |
|--------|------|-------|-------|
| class2 | B | 08:30 | 14:30 |
<强>输出:强>
{{1}}