当我进行内部联接时,为什么我的结果是交叉产品?

时间:2017-06-11 04:45:29

标签: mysql sql join cross-product

我想根据他们的班级和学年显示学生的详细信息 这是我过去常常实现的目标:

SELECT
  a1.fk_stu_id,
  b.stu_fname,
  c.class_name,
  d.section_code,
  e.acad_year
FROM
  tbl_stu_class a1
 JOIN
  tbl_stu_details b
ON
  (b.pk_stu_id = a1.fk_stu_id),
  list_class c
 JOIN
  tbl_stu_class a2
ON
  c.pk_class_id = a2.fk_class_id,
  list_sections d
 JOIN
  tbl_stu_class a3
ON
  d.pk_section_id = a3.fk_section_id,
  list_acad_years e
 JOIN
  tbl_stu_class a4
ON
  e.pk_acad_year_id = a4.fk_year_id
WHERE
  c.class_name = '10';

但这会返回每个学生的学年交叉积... 这是上述查询的输出:

 fk_stu_id  stu_fname   class_name  section_code    acad_year   
      1       sss            10         A             2019
      2     Second           10         A             2019
      1       sss            10         A             2017
      2     Second           10         A             2017

预期结果:

fk_stu_id   stu_fname   class_name  section_code    acad_year   
      1       sss            10         A             2019
      2     Second           10         B             2017

有人可以解释为什么会这样吗?我该如何解决这个问题? 提前谢谢。

2 个答案:

答案 0 :(得分:2)

您的查询已重新格式化以查看正在进行的操作。

SELECT
  a1.fk_stu_id,
  b.stu_fname,
  c.class_name,
  d.section_code,
  e.acad_year
FROM
  tbl_stu_class a1  JOIN tbl_stu_details b ON (b.pk_stu_id = a1.fk_stu_id)
, list_class c      JOIN tbl_stu_class a2  ON c.pk_class_id = a2.fk_class_id
, list_sections d   JOIN tbl_stu_class a3  ON d.pk_section_id = a3.fk_section_id
, list_acad_years e JOIN tbl_stu_class a4  ON e.pk_acad_year_id = a4.fk_year_id

WHERE
  c.class_name = '10';

你有4个单独的JOIN部分,它们之间有逗号。所以你得到了这4个部分的交叉产品。

不要使用逗号,在所有表格之间使用JOIN。

由于tbl_stu_class位于所有部分,class_id可能是将这些部分连接在一起的方式。

但实际上,我认为你根本不需要那些额外的实例a2 .. a4。在没有看到你的表格模式和数据的情况下,真的无法告诉你。

答案 1 :(得分:1)

SELECT
    a.fk_stu_id,
    b.stu_fname,
    c.class_name,
    d.section_code,
    e.acad_year
FROM
    tbl_stu_class a
JOIN
    tbl_stu_details b
ON
    b.pk_stu_id = a.fk_stu_id
JOIN
    list_class c
ON
    c.pk_class_id = a.fk_class_id
JOIN
    list_sections d
ON
    d.pk_section_id = a.fk_section_id
JOIN
    list_acad_years e
ON
    e.pk_acad_year_id = a.fk_year_id
WHERE
    c.class_name = '10';