【问题标题】:How to fetch all recordsets which are linked through that table?如何获取通过该表链接的所有记录集?
【发布时间】:2011-01-01 00:50:13
【问题描述】:

我有三个表格,包含这些字段:

:class_id |姓名 |等级

classes_students:class_id |学生号

学生:student_id |名字

班级与学生是一对一的关系,所以一个班级可以有很多学生。我想选择特定班级的所有学生,其中 class_id 为 5。

我可以做这样的事情吗?

SELECT student.name FROM students student 
LEFT JOIN classes_students link 
    ON link.class_id = 5 
    AND link.student_id = student.student_id

我不确定我是否需要在这里加入,是否必须是“左加入”?我想要的只是一个包含学生姓名的记录集。

【问题讨论】:

  • 您所做的以下陈述并不完全正确:“班级与学生具有 1:n 关系,因此一个班级可以有很多学生”。事实上,班级和学生之间的关系是n:n,因为一个班级可以有很多学生一个学生可以有很多班级。因此需要您的classes_students 表。如果它真的是 1:n 关系,则不需要classes_students 表。

标签: sql mysql


【解决方案1】:

用途:

SELECT s.name
  FROM STUDENTS s
  JOIN CLASSES_STUDENTS cs ON cs.student_id = s.student_id
                          AND cs.class_id = 5

交替:

SELECT s.name
  FROM STUDENTS s
  JOIN CLASSES_STUDENTS cs ON cs.student_id = s.student_id
  JOIN CLASSES c ON c.class_id = cs.class_id
 WHERE c.class_id = 5

因为您只需要特定班级的学生,所以您应该使用 INNER JOIN。如果您想列出所有学生的列表,您可以使用 LEFT JOIN,然后使用 LEFT JOIN 到 CLASSES_STUDENTS 以了解是否有任何人正在上课(因为那些没有上课的人在 CLASSES_STUDENTS 列中会有空值)。我推荐looking at this link for the breakdown of various JOINs and their impact on the data you'll get back

【讨论】:

    【解决方案2】:
    SELECT 
        student.name 
    FROM 
        students student 
    INNER JOIN 
        classes_students link 
    ON
        link.student_id = student.student_id
    WHERE 
        link.class_id = 5
    

    如果您只是将联接更改为 INNER,您的查询实际上应该可以正常工作,但我更喜欢使用 where 子句来过滤结果,而不是将其包含在 JOIN 条件中,我认为它更清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 2016-10-26
      • 2014-08-12
      • 2013-12-11
      相关资源
      最近更新 更多