2012-07-03 3 views
1

Хорошо, небольшое изменение в более ранней теме. Используя ту же основную идею, я хочу получить независимые подсчеты полей, тогда я хочу, чтобы они были сгруппированы по более сложному порядку.MySQL: Group By & Count Несколько полей: REDUX

Я расширил пример Давида, чтобы включить более высокую колонку заказа:

district_id, product_id, service_id 

dist proj serv 
1 1 1 
1 1 2 
1 1 2 
1 1 3 
1 1 3 
1 1 4 
1 2 2 
1 2 4 
1 2 4 
1 2 5 
1 2 5 
2 1 1 
2 2 1 
2 1 6 
2 2 6 
2 3 6 

Чтобы получить результат на общем, я использовал простой запрос с двумя подзапросов.

select 
(select count(Distinct project_id) from GroupAndCountTest) AS "projects", 
(select count(Distinct service_id) from GroupAndCountTest) as "services"; 

projects services 
     3   6 

Задача состояла в том, чтобы сгруппировать его в пределах района_ид. То, что я хотел:

district_id projects services 
      1   2   5 
      2   3   6 

Я закончил с использованием аналогичных подзапросов, но единственным способом, которым я был в состоянии объединить их (кроме использования сохраненной функции) был повторно запустить суб-запросы для каждого р-н. (Здесь нет большой проблемы, но в моем приложении подзапросы используют несколько таблиц со значительным количеством «районов», поэтому два подзапроса запускаются снова для каждого «района», который будет становиться все более неудовлетворительным.

Этот запрос работает, но я хотел бы видеть что-то более эффективные

select t1.district_id, p1.projects, s1.services 
    from GroupAndCountTest as t1 
    join (select district_id, count(Distinct project_id) as projects 
    from GroupAndCountTest 
    group by district_id) AS p1 
    on p1.district_id=t1.district_id 
    join (select district_id, count(Distinct service_id) as services 
    from GroupAndCountTest 
    group by district_id) as s1 
    on s1.district_id=t1.district_id 
    group by t1.district_id; 

Благодаря

PS:.. Если вы хотите поэкспериментировать, вы можете создать таблицу с:

CREATE TABLE `GroupAndCountTest` (
    `district_id` int(5) DEFAULT NULL, 
    `project_id` int(5) DEFAULT NULL, 
    `service_id` int(5) DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
insert into `GroupAndCountTest`(`district_id`,`project_id`,`service_id`) 
    values (1,1,1),(1,1,2),(1,1,2),(1,1,3),(1,1,3),(1,1,4),(1,2,2),(1,2,4), 
    (1,2,4),(1,2,5),(1,2,5),(2,1,1),(2,2,1),(2,1,6),(2,2,6),(2,3,6); 

ответ

3
select district_id, 
count(distinct(product_id)) projects, 
count(distinct(service_id)) services 
from MyTable group by district_id; 

где MyTable содержит district_id, product_id, service_id столбцы

+0

Ooh, отличный ответ Вы избили меня 27 секунд – Jay

+0

Благодаря Priyank и Джей, но мне нужно использовать подзапросы из-за нескольких таблиц!. - мой пример был упрощен. Однако, как только я построил тест с подобными сложностями, чтобы показать, почему этот подход не удалось, я понял, как решить проблему. Извиняюсь за то, что я должен был начать с более сложного примера. Вероятно, не стоит публиковать все это , – DrDave

+0

У меня есть похожий сценарий с небольшой разницей, я хочу, чтобы проекты count (distinct_id) и count (раздельные (serv ice_id)) group by distinct_id, но для каждого столбца существует другое условие. например, count (distinct (product_id)), где is_new = 1 и count (distinct (service_id)), где is_enabled = 1, и в моем случае имеется 12 таких столбцов – vishal

0

Вы делаете этот путь сложнее, чем это должно быть. Для этого вам не нужны подзапросы, просто GROUP BY.

select district_id, count(distinct project_id), count(distinct service_id) 
from GroupAndCountTest 
group by district_id 
0
SELECT district_id, count(DISTINCT (
project_id 
)) projects, count(DISTINCT (
service_id 
)) services 
FROM GroupAndCountTest 
GROUP BY district_id 

Я был продвинутый :(