如何避免统计已录取学生的pending状态?
How to avoid counting the pending statuses of the enrolled students?
我有以下查询,我在其中提供了与课程作者相关的所有信息,其余所有信息都很好,除了在计算注册学生时 COUNT (i.id_inscribed)
因为条件已经过去WHERE
i.status = 'Completed'
应该只考虑已完成状态的学生。
$stmt = $con->prepare("SELECT AVG(ra.rating) AS avg_rating,
COUNT(ra.rating) AS valuations,
SUM(c.study_program='intensive') AS total_intensive,
SUM(c.study_program='proyect') AS total_proyect,
COUNT(i.id_inscribed) AS enrolled_i
FROM tbl_ratings ra
LEFT JOIN tbl_courses c ON ra.id_course = c.id_course
LEFT JOIN tbl_author a ON c.id_author = a.id_author
LEFT JOIN tbl_inscribed i ON i.id_course = c.id_course
WHERE
a.id_author=1 AND
i.status='Completed' AND
(c.study_program='intensive' OR
c.study_program='proyect')
GROUP BY a.id_author;");
这里是查询和实时获取的数据:
https://www.db-fiddle.com/f/s2uBnyTLgTXqADtVhkgEUv/2
您会注意到在 enrolled_i
中它显示 2
,并且由于在 WHERE
中传递的条件类型,它应该显示 1
。我做错了什么?
有与课程作者无关的信息,本次查询的思路是获取该讲师的评论总数,以及该讲师对所有投票的总评价他的课程,导师所拥有的强化课程类型课程和项目类型课程的总和。现在老师的学生总数在这里,你只想获取状态为完成的数据。
并且,在执行此操作时:
(c.study_program='intensive' OR c.study_program='proyect')
对于上述方法,我得到了错误的数据:
avg_rating valuations total_intensive total_proyect enrolled_i
5 1 1 0 1
预期输出如下:
avg_rating valuations total_intensive total_proyect enrolled_i
4 2 1 1 1
提到的更改在此处对我产生错误:https://www.db-fiddle.com/f/s2uBnyTLgTXqADtVhkgEUv/3
您代码中的主要问题是您从 tbl_ratings
开始联接,然后 LEFT
联接所有其他表。
联接应从 tbl_author
.
开始
此外,WHERE
子句中的所有条件(关于作者的条件除外)应移至联接的 ON
子句,因为它们原样将所有联接更改为 INNER
加入:
SELECT AVG(ra.rating) AS avg_rating,
COUNT(ra.rating) AS valuations,
SUM(c.study_program='intensive') AS total_intensive,
SUM(c.study_program='proyect') AS total_proyect,
COUNT(i.id_inscribed) AS enrolled_i
FROM tbl_author a
LEFT JOIN tbl_courses c ON c.id_author = a.id_author AND (c.study_program='intensive' OR c.study_program='proyect')
LEFT JOIN tbl_ratings ra ON ra.id_course = c.id_course
LEFT JOIN tbl_inscribed i ON i.id_course = c.id_course AND i.status='Completed'
WHERE a.id_author=1
参见demo。
我有以下查询,我在其中提供了与课程作者相关的所有信息,其余所有信息都很好,除了在计算注册学生时 COUNT (i.id_inscribed)
因为条件已经过去WHERE
i.status = 'Completed'
应该只考虑已完成状态的学生。
$stmt = $con->prepare("SELECT AVG(ra.rating) AS avg_rating,
COUNT(ra.rating) AS valuations,
SUM(c.study_program='intensive') AS total_intensive,
SUM(c.study_program='proyect') AS total_proyect,
COUNT(i.id_inscribed) AS enrolled_i
FROM tbl_ratings ra
LEFT JOIN tbl_courses c ON ra.id_course = c.id_course
LEFT JOIN tbl_author a ON c.id_author = a.id_author
LEFT JOIN tbl_inscribed i ON i.id_course = c.id_course
WHERE
a.id_author=1 AND
i.status='Completed' AND
(c.study_program='intensive' OR
c.study_program='proyect')
GROUP BY a.id_author;");
这里是查询和实时获取的数据:
https://www.db-fiddle.com/f/s2uBnyTLgTXqADtVhkgEUv/2
您会注意到在 enrolled_i
中它显示 2
,并且由于在 WHERE
中传递的条件类型,它应该显示 1
。我做错了什么?
有与课程作者无关的信息,本次查询的思路是获取该讲师的评论总数,以及该讲师对所有投票的总评价他的课程,导师所拥有的强化课程类型课程和项目类型课程的总和。现在老师的学生总数在这里,你只想获取状态为完成的数据。
并且,在执行此操作时:
(c.study_program='intensive' OR c.study_program='proyect')
对于上述方法,我得到了错误的数据:
avg_rating valuations total_intensive total_proyect enrolled_i
5 1 1 0 1
预期输出如下:
avg_rating valuations total_intensive total_proyect enrolled_i
4 2 1 1 1
提到的更改在此处对我产生错误:https://www.db-fiddle.com/f/s2uBnyTLgTXqADtVhkgEUv/3
您代码中的主要问题是您从 tbl_ratings
开始联接,然后 LEFT
联接所有其他表。
联接应从 tbl_author
.
开始
此外,WHERE
子句中的所有条件(关于作者的条件除外)应移至联接的 ON
子句,因为它们原样将所有联接更改为 INNER
加入:
SELECT AVG(ra.rating) AS avg_rating,
COUNT(ra.rating) AS valuations,
SUM(c.study_program='intensive') AS total_intensive,
SUM(c.study_program='proyect') AS total_proyect,
COUNT(i.id_inscribed) AS enrolled_i
FROM tbl_author a
LEFT JOIN tbl_courses c ON c.id_author = a.id_author AND (c.study_program='intensive' OR c.study_program='proyect')
LEFT JOIN tbl_ratings ra ON ra.id_course = c.id_course
LEFT JOIN tbl_inscribed i ON i.id_course = c.id_course AND i.status='Completed'
WHERE a.id_author=1
参见demo。