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