【问题标题】:SQL Query (or Join) for 3 tables3 个表的 SQL 查询(或联接)
【发布时间】:2013-09-05 17:38:31
【问题描述】:

第一次在 Stack Overflow 上提出问题...令人惊叹的资源,但作为 SQL 新手,只有一件事让我非常困惑。

我有三个表,我想获取与 Bob 的学生相关联的所有导师的姓名。

表 1:教师

================
ID     Name
================
1     Bob

表 2:学生

===================================
STUDENT_ID     Name     TEACHER_ID
===================================
1              Jayne    1
2              Billy    5
3              Mark     2

表 3:MENTOR_RELATIONSHIPS

==============================
ID     STUDENT_ID    MENTOR_ID
==============================
1      1             3
2      2             2
3      3             3

表 4:导师

=====================
MENTOR_ID     Name  
=====================
1            Sally
2            Gillian
3            Sean

我想运行一个查询来查找 Bob 学生的所有导师。所以所有学生的导师TEACHER_ID = 1

在这种情况下,肖恩将是结果。

我知道这与联接有关,或者我可以使用普通查询找到它吗??

非常感谢任何帮助!非常感谢...

【问题讨论】:

    标签: sql join inner-join


    【解决方案1】:

    这应该做的工作

    select distinct m.name from students s
    inner join mentor_ralationships mr on mr.student_id=s.student_id
    inner join mentors m on m.mentoir_id=mr.mentor_id
    where s.teacher_id=1;
    

    【讨论】:

    • 谢谢你 :-) 我马上试试,但为了帮助我理解代码,m.name 中的首字母 m 的目的是什么?是简写吗?还是变量??类似地,students s 中的 smr.mentor_id 中的 mr...?谢谢!
    • 它是表 m 的别名而不是 "mentor" s 而不是 "students" 和 mr 而不是 "mentor_ralationships" 别名在复杂的连接查询中非常有用
    • 只是说这很有魅力,非常感谢您的帮助!
    • 如何仅显示这些表中的选定字段,即 T.ID、T.Name、S.ID、S.Name、M.ID、M.Name?谢谢。
    • 我通过这种方式得到了解决方案...选择 s.ID 作为 StudentID,s.Name 作为 StudentName,mr.ID 作为 MentorID,mr.Name 作为 MentorName 从学生的内部加入 menor_ralationships mr on mr .student_id=s.student_id 内加入导师 m on m.mentoir_id=mr.mentor_id where s.teacher_id=1;
    【解决方案2】:

    没有连接(不是首选)

    SELECT mentors.name FROM mentors 
    WHERE mentors.id 
      IN (SELECT MENTOR_RELATIONSHIPS.mentor FROM  MENTOR_RELATIONSHIPS 
      WHERE  MENTOR_RELATIONSHIPS.student 
        IN (SELECT students.id FROM students WHERE students.teacher 
            = (SELECT teachers.id FROM teachers WHERE teachers.name = 'bob')));
    

    【讨论】:

      【解决方案3】:

      这可能对您有所帮助,因为当老师分配到特定主题时,我必须从三个表 AssignedSubject, Section and SchoolClass 中检索数据,然后我必须找出他的班级和部分详细信息,包括我这样做的 subjectid

      select a.StaffID, a.SubjectID, s.ID as SectionId, s.Name as SectionName, S.Remarks as SectionRemarks, sc.ID as ClassId, sc.Name as ClassName, sc.Remarks as ClassRemarks from AssignedSubject a
           inner join Section s on a.SectionId=s.ID 
           inner join SchoolClass sc on sc.ID=s.ClassId  where a.StaffID=3068
      

      【讨论】:

        【解决方案4】:

        您可以尝试以下方法:

        SELECT DISTINCT m.name
        FROM students s INNER JOIN TEACHERS t ON t.ID = a.TEACHER_ID
          INNER JOIN MENTOR_RELATIONSHIPS mr ON mr.Student_id = s.Student_id
          INNER JOIN Mentors m ON mr.MENTOR_ID = s.MENTOR_ID
        WHERE s.teacher_id = 1   WHERE t.Name = 'Bob';
        

        【讨论】:

          【解决方案5】:
          SELECT TEACHER.NAME, STUDENTS.NAME AS STUDENT NAME, MENTORS.NAME AS MENTOR 
          FROM TEACHERS JOIN STUDENTS ON TEACHERS.ID = STUDENTS.TEACHER_ID 
                        JOIN MENTOR_RELATIONSHIPS ON STUDENTS.STUDENT_ID = 
                             MENTOR_RELATIONSHIPS.STUDENT_ID 
                        JOIN MENTORS ON MENTOR_RELATIONSHIPS.MENTOR_ID = MENTORS.MENTOR_ID 
          WHERE TEACHER.NAME = 'Bob' ;
          

          【讨论】:

          • 欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,因为这会降低代码和解释的可读性!
          猜你喜欢
          • 2015-06-09
          • 2015-12-11
          • 1970-01-01
          • 2011-12-16
          • 1970-01-01
          • 1970-01-01
          • 2023-04-07
          • 2019-05-31
          • 1970-01-01
          相关资源
          最近更新 更多