Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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
Php SQL多重计数查询_Php_Mysql_Sql_Count - Fatal编程技术网

Php SQL多重计数查询

Php SQL多重计数查询,php,mysql,sql,count,Php,Mysql,Sql,Count,我有一个表格,里面有三类学生的成绩。每个类别有五个等级(A、B、C、D、E),因此表格如下所示: id | cat1 | cat2 | cat3 1 A B A 2 D C D 3 B A E 4 C B D Cat1 | Cat2 | Cat 3 A 1 1 1 B 1 2 0 C 1 1

我有一个表格,里面有三类学生的成绩。每个类别有五个等级(A、B、C、D、E),因此表格如下所示:

id | cat1 | cat2 | cat3
1     A      B       A
2     D      C       D
3     B      A       E
4     C      B       D
    Cat1 | Cat2 | Cat 3
A     1     1      1
B     1     2      0
C     1     1      0
D     1     0      2
E     0     0      1

我还有第二张表,上面列出了成绩

grade
  A
  B
  C
  D
  E
我需要能够运行对这些数据的查询,以便我可以计算每个等级在每个类别中获得的等级数。大概是这样的:

id | cat1 | cat2 | cat3
1     A      B       A
2     D      C       D
3     B      A       E
4     C      B       D
    Cat1 | Cat2 | Cat 3
A     1     1      1
B     1     2      0
C     1     1      0
D     1     0      2
E     0     0      1
我已经运行了以下查询,我知道这是不正确的,但得到的结果接近预期:

SELECT g.grade, COUNT( mb.cat1) , COUNT( mb.cat2) , COUNT( mb.cat3)
FROM markbook mb, grades g
WHERE g.grade = mb.cat1
GROUP BY g.grade
尝试:

(SQLFiddle)

试试:


(SQLFiddle)

虽然我知道已经选择了答案,但我的方法是使用左连接,这样如果一个等级没有匹配项,它仍然会出现。示例如下:

SELECT 

  g.grade,
  SUM(CASE mb.cat1 WHEN g.grade THEN 1 ELSE 0 END) AS cat1,
  SUM(CASE mb.cat2 WHEN g.grade THEN 1 ELSE 0 END) AS cat2,
  SUM(CASE mb.cat3 WHEN g.grade THEN 1 ELSE 0 END) AS cat3

FROM grades g
LEFT JOIN markbook mb 
    ON g.grade IN (mb.cat1,mb.cat2,mb.cat3)
GROUP BY g.grade;

(SQL fiddle示例,从Mark Bannisters答案中借用的模式:)

虽然我知道已经选择了一个答案,但我的方法是使用左连接,这样,如果一个等级没有匹配项,它仍然会显示出来。示例如下:

SELECT 

  g.grade,
  SUM(CASE mb.cat1 WHEN g.grade THEN 1 ELSE 0 END) AS cat1,
  SUM(CASE mb.cat2 WHEN g.grade THEN 1 ELSE 0 END) AS cat2,
  SUM(CASE mb.cat3 WHEN g.grade THEN 1 ELSE 0 END) AS cat3

FROM grades g
LEFT JOIN markbook mb 
    ON g.grade IN (mb.cat1,mb.cat2,mb.cat3)
GROUP BY g.grade;

(SQL fiddle示例,从Mark Bannisters那里借用的模式回答:)

在我的查询中使用交叉连接可以确保没有匹配项的分数也会出现在我的查询中-参见。我明白了,我认为它的行为更像内部连接。嗯,你每天都会学到一些新的东西:)这种查询从来没有出现在我经常做的事情中。在我的查询中使用交叉连接可以确保没有匹配项的分数也会出现在我的查询中-看。我知道了,我想它的行为更像是内部连接。嗯,你每天都会学到一些新的东西:)在我的工作中从来没有出现过这种问题。