MySQL CodeIgniter基于第一个Select列从第二个表中选择或不选择

时间:2015-05-28 07:33:49

标签: php mysql codeigniter

我有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用于将学生与他们的班级联系起来......

1 个答案:

答案 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}}