Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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 统计不同项目的发生次数_Mysql - Fatal编程技术网

Mysql 统计不同项目的发生次数

Mysql 统计不同项目的发生次数,mysql,Mysql,该表存储了任何考试中科目不及格的学生的姓名以及考试进行时的姓名。所以可能会有重复的记录,因为它的时间线是一整年。这些科目是静态的,比如说2(数学、科学)。我需要一个学生在一年中每一次考试中失败的次数 我的问题是: select a.name, (select count(*) from student where name = a.name and subject = 'maths' ) as maths

该表存储了任何考试中科目不及格的学生的姓名以及考试进行时的姓名。所以可能会有重复的记录,因为它的时间线是一整年。这些科目是静态的,比如说2(数学、科学)。我需要一个学生在一年中每一次考试中失败的次数

我的问题是:

select a.name,
       (select count(*) 
          from student
         where name = a.name 
           and subject = 'maths'
       ) as maths,
       (select count(*) 
          from student
         where name = a.name 
           and subject = 'science'
       ) as science
  from student a
 group by name 
虽然我的查询可以工作,但当主题数超过两个时,它并不高效。 另外,我知道这张桌子的结构会更好?但这是一项任务

编辑:问题是,主题数量约为10个。那么最好的查询是什么?我应该将它们存储在一个数组或一个单独的表中吗


非常感谢!!:)祝您快乐:)

用例表达式,在这里您可以使用SUM()

或者利用COUNT(){不计算NULL}


或者您可以在使用COUNT()时包含“else NULL”

如果我给您答案,您愿意与我分享您的分数吗?顺便说一句,关于这个问题有很多答案,所以(参见pivot表)对于mysql来说更简单
sum(subject='math')
我更喜欢显式表达式,因为它们更“自我记录”。简短的代码并不总是最好的代码。当主题数量大约为10个时,我该怎么做?感谢您的时间(顺便说一句:)只需为每列添加一个case表达式。首先复制一行,粘贴n次,然后更改每行的主题名称以适应。有不同的方法将数据从行“透视”到列,但这种case表达式方法适用于mysql以及任何其他符合SQL的dbms。
select a.name
     , SUM(case when subject = 'maths' then 1 else 0 end) as maths
     , SUM(case when subject = 'science' then 1 else 0 end) as science
from student a
group by a.name 
select a.name
     , COUNT(case when subject = 'maths' then 1 end) as maths
     , COUNT(case when subject = 'science' then 1 end) as science
from student a
group by a.name