Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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_Sql_Database - Fatal编程技术网

mySQL计数表

mySQL计数表,mysql,sql,database,Mysql,Sql,Database,基本上我有一个表名myTable,里面有name,Class,我想像下面的表一样对它们进行分类,每个名称的计数和它们拥有的1,2,3个数字。下面是我目前拥有的代码,但它只处理少量的条目,如果表有20000行,则需要很长时间才能执行 Select DISTINT(Name), (Select count(*) from `myTable` d1 where d1.Name = dd.Name and Class=1), (Select count(*) from `my

基本上我有一个表名myTable,里面有name,Class,我想像下面的表一样对它们进行分类,每个名称的计数和它们拥有的1,2,3个数字。下面是我目前拥有的代码,但它只处理少量的条目,如果表有20000行,则需要很长时间才能执行

Select DISTINT(Name),
       (Select count(*) from `myTable` d1 where d1.Name = dd.Name and Class=1),
       (Select count(*) from `myTable` d2 where d2.Name = dd.Name and Class=2),
       (Select count(*) from `myTable` d3 where d3.Name = dd.Name and Class=3)
from `myTable` dd
Order by Name;

使用条件计数进行分组:

select Name,
       count(case when class = 1 then 1 end),
       count(case when class = 2 then 1 end),
       count(case when class = 3 then 1 end)
from `myTable`
group by Name;
注意:
DISTINCT
不是列上的函数,它作用于整个选定行。(列名是否放在括号内并不重要。)

select distinct col1, col2, ...
select distinct col1, (col2), ...
也和

select distinct col1, col2, ...
select distinct col1, (col2), ...

这是典型的条件聚合:

Select Name,
       sum(case when Class = 1 then 1 else 0 end),
       sum(case when Class = 2 then 1 else 0 end),
       sum(case when Class = 3 then 1 else 0 end)
from myTable
group by Name
您可以将其旋转:

SELECT t.Name,
    SUM(if(t.Class=1,1,null)) as Class1,
    SUM(if(t.Class=2,1,null)) as Class2,
    SUM(if(t.Class=3,1,null)) as Class3
FROM myTable t
GROUP BY t.Name

感谢您高效的回答,现在50000条条目的查询时间快多了。