Mysql 左关节聚合中的SQL计数?

Mysql 左关节聚合中的SQL计数?,mysql,sql,database,Mysql,Sql,Database,我有四张桌子,如下图所示 我想统计一下有多少学生的状态为“v”在表格提交中,有多少学生的提交类型为“1”,并按学生id进行分组,因此在最后一个表格中,我可以得到这样的表格 select p.id, (SELECT count(*) FROM (select b.id from student as a , submission as b WHERE a.id = b.student_id and b.id_submission_type =1 and a.status_n='v' and

我有四张桌子,如下图所示

我想统计一下有多少学生的状态为“v”在表格提交中,有多少学生的提交类型为“1”,并按学生id进行分组,因此在最后一个表格中,我可以得到这样的表格

select p.id, (SELECT count(*) FROM  (select b.id from student as a , submission  as b WHERE a.id = b.student_id and b.id_submission_type =1  and a.status_n='v' and a.id_academic_programe = p.id GROUP BY b.student_id) )  from academic_programe as p
我尝试过这样的sql查询

select p.id, (SELECT count(*) FROM  (select b.id from student as a , submission  as b WHERE a.id = b.student_id and b.id_submission_type =1  and a.status_n='v' and a.id_academic_programe = p.id GROUP BY b.student_id) )  from academic_programe as p
但请告诉我错误

1054-where子句中的未知列“p.id”
有什么建议吗?对不起,我的英语相关性不能在嵌套子查询中。幸运的是,这很容易解决:

select p.id,
       (select count(*)
        from student st join
             submission su 
             on st.id = su.student_id and
                su.id_submission_type = 1 and
                st.status_n = 'v' and
        where st.id_academic_programe = p.id
       )
from academic_programe p;

相关性不能位于嵌套子查询中。幸运的是,这很容易解决:

select p.id,
       (select count(*)
        from student st join
             submission su 
             on st.id = su.student_id and
                su.id_submission_type = 1 and
                st.status_n = 'v' and
        where st.id_academic_programe = p.id
       )
from academic_programe p;
试试这个:

select c.academic_program_name,count(a.distinct student_name) as count
from
(select * from student where status = 'v') a
inner join
(select * from submission id_submission_type=1) b
on a.id  =b.student_id
inner join
academic_program_name c
on a.id_academic_programe = c.id
group by c.academic_program_name;  
如果有任何疑问,请告诉我。

尝试以下方法:

select c.academic_program_name,count(a.distinct student_name) as count
from
(select * from student where status = 'v') a
inner join
(select * from submission id_submission_type=1) b
on a.id  =b.student_id
inner join
academic_program_name c
on a.id_academic_programe = c.id
group by c.academic_program_name;  

如果有任何疑问,请告诉我。

请尝试以下方法

SELECT student.id,
       student_name,
       academic_program_name AS Programe,
       COUNT( status_n ) AS status_n_count
FROM student
JOIN Submission ON student.id = Submission.student_id
RIGHT JOIN academic_program ON student.id_academic_programe = academic_program.id
WHERE id_submission_type = 1
  AND status_n = 'v'
GROUP BY student.id,
         student_name,
         academic_program_name;
此语句首先连接
学生
提交
,以获得包含
学生
id、
学生姓名
状态
id提交类型
字段的表。然后将其
右连接
ed以形成一个表格,其中列出了每个学术课程以及每个学生的详细信息,并且仍然列出了没有学生的课程

根据您的标准,使用
WHERE
子句、
GROUP
ed和
SELECT
ed对结果数据集进行细化


如果您有任何问题或意见,请随时发表相应的意见。

请尝试以下内容

SELECT student.id,
       student_name,
       academic_program_name AS Programe,
       COUNT( status_n ) AS status_n_count
FROM student
JOIN Submission ON student.id = Submission.student_id
RIGHT JOIN academic_program ON student.id_academic_programe = academic_program.id
WHERE id_submission_type = 1
  AND status_n = 'v'
GROUP BY student.id,
         student_name,
         academic_program_name;
此语句首先连接
学生
提交
,以获得包含
学生
id、
学生姓名
状态
id提交类型
字段的表。然后将其
右连接
ed以形成一个表格,其中列出了每个学术课程以及每个学生的详细信息,并且仍然列出了没有学生的课程

根据您的标准,使用
WHERE
子句、
GROUP
ed和
SELECT
ed对结果数据集进行细化


如果您有任何问题或意见,请随时发表相应的意见。

谢谢您的回复,该代码是有效的,但我只想计算一个学生id,尽管他们提交了多个提交。在我的表格提交中,学生可以多次提交同一类型的提交。你知道我怎么做吗?我希望该组具有学生id。@eniac05。在子查询中使用
count(不同的su.student\u id)
,而不是
count(*)
。感谢您的回复,该代码是有效的,但我希望只计算一个student\u id,尽管他们提交了多个提交。在我的表格提交中,学生可以多次提交同一类型的提交。你知道我怎么做吗?我希望该组具有学生id。@eniac05。在子查询中使用
count(不同的su.student\u id)
,而不是
count(*)