Mysql SQL查询:由一个联接表链接到另一个联接表的行

Mysql SQL查询:由一个联接表链接到另一个联接表的行,mysql,sql,Mysql,Sql,我正在使用MySQL。在我的数据库中,我有以下表格: 学生表格。此表的主键是sid A高中表格。主键是hid A大学表格。主键是uid 然后: 有一个联合表用于学生和高中,该表名为联合表它有两列:sid和hid,分别链接到学生和高中中的行 还有另一个联合表格用于学生和大学,名为联合表格,它还有两列:sid和uid,分别链接到学生和大学中的行 我的问题和疑问: 我想让那些学生通过sid链接到joint_table_A中的hid=3也链接到joint_table_B的sid,并将uid的值设置为

我正在使用MySQL。在我的数据库中,我有以下表格:

  • 学生表格。此表的主键是
    sid

  • A
    高中
    表格。主键是
    hid

  • A
    大学
    表格。主键是
    uid

  • 然后:

    • 有一个联合表用于
      学生
      高中
      ,该表名为
      联合表
      它有两列:
      sid
      hid
      ,分别链接到
      学生
      高中
      中的行

    • 还有另一个联合表格用于
      学生
      大学
      ,名为
      联合表格
      ,它还有两列:
      sid
      uid
      ,分别链接到
      学生
      大学
      中的行

    我的问题和疑问:

    我想让那些
    学生通过
    sid
    链接到
    joint_table_A
    中的
    hid=3
    也链接到
    joint_table_B
    sid
    ,并将
    uid
    的值设置为
    1
    。此操作的SQL查询是什么

    ====更新========

    目前我在下面得到了3个答案,一个使用
    连接
    ,一个使用
    左连接
    ,最后一个使用
    内部连接
    。我被那些
    连接弄糊涂了(我还在学习SQL)。如果您能添加一些解释,这将更有助于我理解您的答案,以便我了解您的答案之间的差异。谢谢

    这应该有效:

    SELECT student.*
    FROM   student
      JOIN joint_table_A USING (sid)
      JOIN joint_table_B USING (sid)
    WHERE  joint_table_A.hid = 3
       AND joint_table_B.uid = 1
    
    SELECT *
    FROM student s
        LEFT JOIN joint_table_A a ON a.sid=s.sid
        LEFT JOIN high_school h ON h.hid=a.sid
        LEFT JOIN joint_table_B b ON b.sid=s.sid
        LEFT JOIN university u ON u.uid=b.uid
    WHERE h.hid = 3 AND u.uid=1
    
    要尝试解释此查询的
    左连接
    内部连接
    之间的差异,请执行以下操作:

    假设你在
    学生
    中有1000条记录,但在
    联合表格A
    中只有50条记录,给出了50所高中学生的hid,在
    联合表格B
    中还有50条记录

    当您
    LEFT JOIN
    时,左表中的所有行(
    students
    )都将保留,即使它们无法与右表中的记录合并。当您
    内部联接时
    只保留可以联接的行-左侧和右侧表中都存在
    sid

    使用左连接

  • 1000
    student
    join to 50
    joint_table_A
    records-在join之后950条记录具有
    hid=NULL
  • 来自上一次联接的1000条记录被联接到
    joint\u table\u B
    -950条记录具有
    uid=NULL
  • 现在检查所有1000条记录的
    ,其中a.hid=3和b.uid=1
  • 使用内部联接

  • 1000
    student
    join to 50
    joint_table_A
    records-在join之后只剩下50条可以加入的记录
  • 前一次加入的50条记录被加入到
    联合表格\u B
    -20条记录可以加入(并非所有高中记录的学生也有大学记录)
  • 现在检查20条记录的
    ,其中a.hid=3和b.uid=1

  • 您可以看到为什么在这种情况下使用
    内部连接

    @Mellon:
    连接
    只是
    内部连接
    的简写。与
    左连接的区别最好用以下公式来解释:在这种情况下,内部连接是您想要的-(连接显然是相同的,但我始终明确声明我使用的连接类型)。在左联接中,您将保留结果集中students表中的所有记录,即使这些记录与其中一个联接表中的任何记录都不匹配,因为我们是基于联接表中的字段进行筛选的,所以筛选该联接表中没有任何值的结果是没有意义的,因此,如果这有意义的话,你也可以在加入的过程中把它们去掉。所有3个答案都会给出相同的结果集。之前的评论+1。在您的案例中应该是JOIN或internal JOIN not LEFT JOIN。@Mellon请参阅eggyal注释您应该使用JOIN或internal JOIN not LEFT JOIN,如我上面的回答所示。我的错误。
    
    SELECT s.* 
    FROM students s
    INNER JOIN joint_table_A a ON s.sid = a.sid
    INNER JOIN joint_table_B b ON s.sid = b.sid
    WHERE a.hid = 3
      AND b.uid = 1