我想根据他们的班级和学年显示学生的详细信息 这是我过去常常实现的目标:
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
有人可以解释为什么会这样吗?我该如何解决这个问题? 提前谢谢。
答案 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';