Хорошо, небольшое изменение в более ранней теме. Используя ту же основную идею, я хочу получить независимые подсчеты полей, тогда я хочу, чтобы они были сгруппированы по более сложному порядку.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);
Ooh, отличный ответ Вы избили меня 27 секунд – Jay
Благодаря Priyank и Джей, но мне нужно использовать подзапросы из-за нескольких таблиц!. - мой пример был упрощен. Однако, как только я построил тест с подобными сложностями, чтобы показать, почему этот подход не удалось, я понял, как решить проблему. Извиняюсь за то, что я должен был начать с более сложного примера. Вероятно, не стоит публиковать все это , – DrDave
У меня есть похожий сценарий с небольшой разницей, я хочу, чтобы проекты 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