复杂的SELECT SQL语句

时间:2014-01-20 05:09:20

标签: mysql sql

有一些课程。课堂上的学生学习科目。我将这些表连接到每个表格上:对于1个班级,将有许多科目,对于1个科目,将有许多班级。 Subject M <=> M Class。所以我的数据库中有3个表来创建这些关系:

主题:

+----+------+
+ id + name +
+----+------+

类别:

+----+-------+------+
+ id + digit + char +
+----+-------+------+

ClassVsTeacher(连接这两个表):

+----+----------+------------+
+ id + class_id + subject_id +
+----+----------+------------+

TeacherVsClass(对于第二个问题很重要,连接班级和老师):

+----+----------+------------+
+ id + class_id + teacher_id +
+----+----------+------------+

1)我是对的吗?

2)我正在努力将主题添加到课堂上。 我想在下拉列表中显示至少有1名教师,但当前班级已经连接的科目除外。

我知道如何展示至少有一位老师的所有科目:

select 
    `s`.`id`, `s`.`name`
from `Subject` as `s`
where 
    `s`.`id` in (select `subject_id` from `TeacherVsSubject`)

它工作正常,但我无法理解如何显示这个,除了已经连接到当前类的主题。这是我的问题。

2 个答案:

答案 0 :(得分:0)

我认为你走在正确的轨道上。

我使用的表名如下:

SubjectsPerClass

TeachersPerClass

然后我创建一个join语句并将其保存为视图,然后从现在开始查询视图

SELECT * 
FROM `SubjectsPerClass` sc
JOIN `Subject` s
   ON `s`.`id` = `sc`.`subject_id`
JOIN `Class` c
   ON `c`.`id` = `sc`.`class_id`

然后,如果您使用的是phpMyAdmin,请点击最后的Create View。我通常将视图命名为ClassesInfo(我使用Info作为视图)。您可以选择选择所需的字段。

然后将来你可以做

SELECT *
FROM `ClassesInfo`
WHERE (conditions here)

答案 1 :(得分:0)

解决方案:

select * from Subject
where id in (select subject_id from TeacherVsSubject)
and id not in (select subject_id from ClassVsSubject where class_id = XX)

我们选择所有主题,如果id中有相同TeacherVsSubject行,且ClassVsSubject中没有任何行id且该类= XXXX = id类,我将为其添加主题。