如何避免统计已录取学生的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