Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL查询使用子查询选择每个学生的出勤率不能使用父查询中的行_Mysql_Sql_Subquery - Fatal编程技术网

Mysql SQL查询使用子查询选择每个学生的出勤率不能使用父查询中的行

Mysql SQL查询使用子查询选择每个学生的出勤率不能使用父查询中的行,mysql,sql,subquery,Mysql,Sql,Subquery,我在SQL中遇到了一个问题,我试图在我正在构建的注册系统中计算一个班级的学生出勤率,但是它不允许我使用子查询中的父列 SELECT A.student_id, TRUNCATE((100 - ((100/B.reg_num) * C.abs_num)), 0) AS attendance FROM students A JOIN ( SELECT COUNT(*) AS reg_num FROM students JOIN seminargroup_student ON seminargroup

我在SQL中遇到了一个问题,我试图在我正在构建的注册系统中计算一个班级的学生出勤率,但是它不允许我使用子查询中的父列

SELECT A.student_id, TRUNCATE((100 - ((100/B.reg_num) * C.abs_num)), 0) AS attendance FROM
students A
JOIN (
SELECT COUNT(*) AS reg_num
FROM students
JOIN seminargroup_student ON seminargroup_student.student_id = students.student_id
JOIN seminar_group ON seminar_group.seminar_group_id = seminargroup_student.seminar_group_id
JOIN modules ON modules.module_id = seminar_group.seminar_group_module_id
JOIN register_seminar ON register_seminar.seminar_id = seminar_group.seminar_group_id
JOIN registers ON registers.register_id = register_seminar.register_id
WHERE modules.module_id =1 AND students.student_id = A.student_id
) B
JOIN (
SELECT COUNT(*) AS abs_num
FROM students
JOIN seminargroup_student ON seminargroup_student.student_id = students.student_id
JOIN seminar_group ON seminar_group.seminar_group_id = seminargroup_student.seminar_group_id
JOIN modules ON modules.module_id = seminar_group.seminar_group_module_id
JOIN absence ON students.student_id = absence.student_id
WHERE modules.module_id =1 AND students.student_id = A.student_id
) C
这将返回:1054-where子句中的未知列“A.student_id”


谢谢你的帮助

尝试将查询重写为:

SELECT students.student_id, TRUNCATE((100 - ((100/B.reg_num) * C.abs_num)), 0) AS attendance FROM 
students 
JOIN ( 
SELECT COUNT(*) AS reg_num 
FROM students A
JOIN seminargroup_student ON seminargroup_student.student_id = A.student_id 
JOIN seminar_group ON seminar_group.seminar_group_id = seminargroup_student.seminar_group_id 
JOIN modules ON modules.module_id = seminar_group.seminar_group_module_id 
JOIN register_seminar ON register_seminar.seminar_id = seminar_group.seminar_group_id 
JOIN registers ON registers.register_id = register_seminar.register_id 
HAVING modules.module_id =1 AND students.student_id = A.student_id 
) B 
JOIN ( 
SELECT COUNT(*) AS abs_num 
FROM students A
JOIN seminargroup_student ON seminargroup_student.student_id = A.student_id 
JOIN seminar_group ON seminar_group.seminar_group_id = seminargroup_student.seminar_group_id 
JOIN modules ON modules.module_id = seminar_group.seminar_group_module_id 
JOIN absence ON A.student_id = absence.student_id 
HAVING modules.module_id =1 AND students.student_id = A.student_id 
) C
UPD:WHERE子句替换为HAVING,别名在子查询中移动。 选择前计算的位置可能会导致错误

此外,这些问题可能有助于您解决问题: 1.
2.

尝试将查询重写为:

SELECT students.student_id, TRUNCATE((100 - ((100/B.reg_num) * C.abs_num)), 0) AS attendance FROM 
students 
JOIN ( 
SELECT COUNT(*) AS reg_num 
FROM students A
JOIN seminargroup_student ON seminargroup_student.student_id = A.student_id 
JOIN seminar_group ON seminar_group.seminar_group_id = seminargroup_student.seminar_group_id 
JOIN modules ON modules.module_id = seminar_group.seminar_group_module_id 
JOIN register_seminar ON register_seminar.seminar_id = seminar_group.seminar_group_id 
JOIN registers ON registers.register_id = register_seminar.register_id 
HAVING modules.module_id =1 AND students.student_id = A.student_id 
) B 
JOIN ( 
SELECT COUNT(*) AS abs_num 
FROM students A
JOIN seminargroup_student ON seminargroup_student.student_id = A.student_id 
JOIN seminar_group ON seminar_group.seminar_group_id = seminargroup_student.seminar_group_id 
JOIN modules ON modules.module_id = seminar_group.seminar_group_module_id 
JOIN absence ON A.student_id = absence.student_id 
HAVING modules.module_id =1 AND students.student_id = A.student_id 
) C
UPD:WHERE子句替换为HAVING,别名在子查询中移动。 选择前计算的位置可能会导致错误

此外,这些问题可能有助于您解决问题: 1. 2.

它不允许我在子查询中使用父列

一般来说,您不需要在FROM中的子查询中引用父查询

相反,您只需将联接字段添加到子查询中的SELECT和GROUP BY子句中,然后进行联接

e、 g

作为补充说明,如果使用左连接并对PK字段而不是对PK字段进行不同计数,则不必执行两个子查询*

SELECT 
    A.student_id, 
    TRUNCATE((100 - ((100/counts.reg_num) * counts.abs_num)), 0) AS attendance
FROM
students A   
JOIN 
(SELECT 
    COUNT(DISTINCT absence.absence_id) AS abs_num , --OR whatever the PK is
    COUNT(DISTINCT registers.regeister_id) as reg_num,
    students.student_id


FROM   students 
       JOIN seminargroup_student 
         ON seminargroup_student.student_id = students.student_id 
       JOIN seminar_group 
         ON seminar_group.seminar_group_id = 
            seminargroup_student.seminar_group_id 
       JOIN modules 
         ON modules.module_id = seminar_group.seminar_group_module_id 

       LEFT JOIN register_seminar 
         ON register_seminar.seminar_id = seminar_group.seminar_group_id 
       LEFT JOIN registers 
         ON registers.register_id = register_seminar.register_id   


       LEFT JOIN absence 
         ON students.student_id = absence.student_id 
GROUP BY
    students.student_id) COUNTS
ON a.student_id = coutnts.student_ID    
它不允许我在子查询中使用父列

一般来说,您不需要在FROM中的子查询中引用父查询

相反,您只需将联接字段添加到子查询中的SELECT和GROUP BY子句中,然后进行联接

e、 g

作为补充说明,如果使用左连接并对PK字段而不是对PK字段进行不同计数,则不必执行两个子查询*

SELECT 
    A.student_id, 
    TRUNCATE((100 - ((100/counts.reg_num) * counts.abs_num)), 0) AS attendance
FROM
students A   
JOIN 
(SELECT 
    COUNT(DISTINCT absence.absence_id) AS abs_num , --OR whatever the PK is
    COUNT(DISTINCT registers.regeister_id) as reg_num,
    students.student_id


FROM   students 
       JOIN seminargroup_student 
         ON seminargroup_student.student_id = students.student_id 
       JOIN seminar_group 
         ON seminar_group.seminar_group_id = 
            seminargroup_student.seminar_group_id 
       JOIN modules 
         ON modules.module_id = seminar_group.seminar_group_module_id 

       LEFT JOIN register_seminar 
         ON register_seminar.seminar_id = seminar_group.seminar_group_id 
       LEFT JOIN registers 
         ON registers.register_id = register_seminar.register_id   


       LEFT JOIN absence 
         ON students.student_id = absence.student_id 
GROUP BY
    students.student_id) COUNTS
ON a.student_id = coutnts.student_ID    

您的样本不包含“A.student\u id”,您将学生用作和学生。请发布导致错误的代码。我在任何WHERE子句中都找不到.student\u id。它只存在于SELECT子句中。在外部查询中,也没有与三个连接中的任何一个关联的ON子句……您的示例不包含“A.student\u id”,您将学生用作and学生。请发布导致错误的代码。我在任何WHERE子句中都找不到.student\u id。它只存在于SELECT子句中。在外部查询中,也没有与三个连接中的任何一个相关联的ON子句……感谢您的回复,这只对第一个学生有效,每行都提取了相同的内容编辑了我的答案。请看一看这是否解决了你的问题谢谢你的回答,这只对第一个学生有效,每一行都有相同的内容修改了我的答案。请看一下这是否解决了您的问题您的第二个建议是不可靠的,因为可能存在迷你笛卡尔积,这会扭曲结果。COUNTDISTINCTs可能会解决这个问题,但我不确定。@AndriyM是的,它确实解决了这个问题。你可以比较这篇文章的第一个和第二个结果。你的第二个建议是不可靠的,因为可能会有小笛卡尔积,这会扭曲结果。COUNTDISTINCTs可能会解决这个问题,但我不确定。@AndriyM是的,它确实解决了这个问题。您可以比较第一个和第二个结果,谢谢