2017-09-04 58 views
0

我有包含以下数据MySQL表如下:如何确保特定列组只计算一次BY

MariaDB [testdb]> select * from courses; 
+---------+---------+ 
| student | class | 
+---------+---------+ 
| A  | Math | 
| B  | English | 
| C  | Math | 
| D  | Biology | 
| E  | Math | 
| F  | Math | 
| A  | Math | 
+---------+---------+ 
7 rows in set (0.00 sec) 

现在我有,我希望看到的计数的简单情况的人参加特定班级。所以我用这个查询,让我有如下结果:

MariaDB [testdb]> select class, count(class) from courses group by class; 
+---------+--------------+ 
| class | count(class) | 
+---------+--------------+ 
| Biology |   1 | 
| English |   1 | 
| Math |   5 | 
+---------+--------------+ 
3 rows in set (0.01 sec) 

但这里的前提条件是,它与学生=“A”计数的行类=“数学”的两倍。

当我们进行点数计算时,我必须确保每个学生只被计入一次。

我如何修改上述查询来实现这一目标?

在此先感谢您的任何答案。

+1

见COUNT(DISTINCT ...),但你真的需要这里PRIMARY KEY。并且要小心你正在计算的内容以及你正在分组的内容。 – Strawberry

+0

阅读['COUNT()'](https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_count)函数。它接受'DISTINCT'修饰符。 – axiac

+0

我明白你的意思了,但我不禁想到或许问题出在数据本身。为什么学生A要被列出两次?这不是一个错误?如果不是,为什么不计算两次?有些东西不适合这里。 – Neil

回答

0

尝试此查询

SELECT temp.class,count(temp.class) FROM(
select student,class from courses group by student 
) AS temp 
GROUP BY `class`; 
0

您可以使用DISTINCT,例如:

SELECT class, COUNT(DISTINCT(student)) 
FROM courses 
GROUP BY class; 

这应该给你去deuped计数。

或者,您也可以通过班级和学生组,让每类计算每个学生例如为:

SELECT class, student, COUNT(*) 
FROM courses 
GROUP BY class, student;