2015-06-24 3 views
2

myTableMySql счетчик таблицы эффективно

В принципе у меня есть имя таблицы MyTable и внутри имеет имя, класс, я хотел бы, чтобы разобраться в них, как в таблице ниже со счетчиком каждого имени и числа 1,2, 3s, которые у них есть. Ниже приведены коды, которые я имел в настоящее время, но он работает с небольшим количеством записей, если таблица имеет 20 000 строк, для выполнения которой потребовалось очень много времени.

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; 

ответ

2

It является классической условной агрегацией:

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 
+0

спасибо за ваш эффективный ответ, время запроса для 50 000 записей намного быстрее. – newbieprogrammer

0

Сделайте GROUP BY с условным подсчетом:

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), ... 
0

Вы можете его развернуть:

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 
Смежные вопросы