【问题标题】:Complex SELECT SQL statement复杂的 SELECT SQL 语句
【发布时间】:2014-01-20 05:09:20
【问题描述】:

有一些课程。课堂上的学生学习科目。我将这些表格连接到每个表格: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 位老师的所有科目,但当前班级已经连接的科目除外。

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

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

它工作正常,但我不明白如何展示这一点,除了已经连接到当前课程的科目。这是我的问题。

【问题讨论】:

  • 一门课只有一位老师教吗?还是很多老师可以教一门学科?
  • 注意为了便于阅读,您不需要在 MySQL 中对每个名称进行反引号转义,只要那些也是关键字的名称即可。
  • 我想你的意思是ClassVsSubject
  • @Prodikl,当然是ClassVsSubject。 @Dai,好的,谢谢。 @hashbrown,很多老师都可以教一门学科。

标签: mysql sql


【解决方案1】:

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

我会使用如下表名:

SubjectsPerClass

TeachersPerClass

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

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 位老师的所有科目,除了当前班级已经连接的科目。怎么做。我知道如何获取有老师的科目,但我不知道如何过滤掉已经与班级相关的科目。这就是问题所在。无论如何,谢谢你的回答!
  • 创建view 后,就可以创建SELECT * FROM ClassesInfo WHERE teacher_id != null AND class_id != 12。当然把你当前的班级ID放在那里
  • 精氨酸。我的英语太差了?:(我正在管理课程的主题。例如,现在用户在“课程简介”页面上。他按“添加主题”并出现带有主题的下拉列表。关于如何操作的问题获取此列表。将向用户建议的主题将是(此列表中将包含哪些主题):显示所有未与此类链接的主题(用户已将此主题添加到此类)并且所有主题必须具有至少有 1 位老师。你现在明白我的意思了吗?你试图帮助我管理现有的科目,这些科目已经与课堂相关联。我不需要它。
  • 对不起,这很混乱。最后,这里的示例应该向您展示如何使用任何其他数据组合来执行此操作。您可以使用更长的连接集创建另一个View,加入TeachersPerClass 等。然后select 满足您的需求。您是否使用过MySQL Workbench 并尝试制作EER 图表?这可能会帮助您更好地可视化数据。
  • 不明白是什么问题。检查答案以获得解决方案。
【解决方案2】:

解决方案:

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

如果在TeacherVsSubject 中有具有相同id 的行并且在ClassVsSubject 中没有具有相同id 的行具有相同的id class= XX,我们将选择所有主题。 XX = id 的班级,我将为此添加主题。

【讨论】:

    猜你喜欢
    • 2021-01-19
    • 2011-06-07
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 2015-01-30
    相关资源
    最近更新 更多