【问题标题】:MySQL - How can I get names of all students that were taught by teacher with name John?MySQL - 我怎样才能获得由约翰老师教过的所有学生的名字?
【发布时间】:2010-08-03 11:31:42
【问题描述】:

我怎样才能得到约翰老师教过的所有学生的名字?

学生

id
name

student_has_teacher

teacher_id
student_id

老师

id
name

【问题讨论】:

  • 听起来像是功课。大概你有一张学生和老师的桌子。看看 JOIN 和 WHERE 语句怎么样?
  • 显然您需要查看 INNER JOHN 子句。
  • +1 为 INNER JOHN。正版哈哈!

标签: sql mysql database join


【解决方案1】:

您必须使用Inner Joins。内连接通过基于连接谓词组合两个表的列值来创建一个新的结果表。您的查询可能看起来像这样:

SELECT      student.name
FROM        student
INNER JOIN  student_has_teacher ON (student_has_teacher.student_id = student.id)
INNER JOIN  teacher ON (teacher.id = student_has_teacher.teacher_id)
WHERE       teacher.name = 'John';

【讨论】:

  • 当然你不应该使用 select *,那也是很糟糕的技术。加入时会浪费服务器和网络资源。不要鼓励使用糟糕的技术。
【解决方案2】:
SELECT s.name
FROM student s 
    INNER JOIN student_has_teacher st ON s.id = st.student_id
    INNER JOIN teacher t ON st.teacher_id = t.id
WHERE t.name = 'John'

【讨论】:

    【解决方案3】:

    下面的第一个查询假设student_has_teacher中可能存在重复记录,即使出现这种情况也会避免导致重复结果:

    select s.id, s.name
    from student s
    where s.id in (
        select sht.student_id 
        from student_has_teacher sht
        inner join teacher on sht.teacher_id = t.id
        where t.name = 'John'
    )
    

    如果 student_has_teacher 中没有重复项,则可以使用连接,如下所示:

    select s.id, s.name
    from student s
    inner join student_has_teacher sht on s.id = sht.student_id
    inner join teacher on sht.teacher_id = t.id
    where t.name = 'John'
    

    【讨论】:

      【解决方案4】:

      以下查询肯定会为您提供所需的结果。

      SELECT st.name
      FROM student AS st
      LEFT JOIN student_has_teacher AS stte ON st.id = stte.student_id
      LEFT JOIN teacher AS te ON stte.teacher_id = te.id
      WHERE te.name = "John"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-23
        • 2013-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多