@edvardpotter

Как проще всего сделать выборку количества каждого типа?

Имеются следующие таблицы:
example:
id, user_id, status (1,2,3), type_id
15, 53, 1, 1
16, 53, 1, 3
17, 53, 1, 4
18, 53, 3, 3
19, 53, 3, 3
20, 53, 3, 3

types:
id, code
1, "type 1"
3, "type 3"
4, "type 4"

Требуется получить кол-во записей для этого пользователя с status = 1, а так же вывести кол-во каждого типа, причем выбирать только из тех у которых status = 3, пример:
"кол-во со статусом 1", "кол-во для типа 1", "кол-во для типа 3", "кол-во для типа 4"
3, 0, 3, 0

На ум пришел банальный вариант с подзапросами, но выглядит слишком статично:
SELECT count(distinct id) "кол-во со статусом 1",
       (
           select count(type_id)
           from example e_1
           where type_id = 1 and user_id = e.user_id and e_1.status = 3
       ) "кол-во для типа 1",
       (
           select count(type_id)
           from example e_3
           where type_id = 3 and user_id = e.user_id and e_3.status = 3
       ) "кол-во для типа 3",
       (
           select count(type_id)
           from example e_4
           where type_id = 4 and user_id = e.user_id and e_4.status = 3
       ) "кол-во для типа 4"
FROM example e
WHERE e.status = 1
GROUP BY user_id
HAVING e.user_id = 53;


SQL - почти псевдо код для примера, но кейс достаточно реальный
  • Вопрос задан
  • 494 просмотра
Решения вопроса 1
@alexalexes
У вас практически готово решение, только отвязать привязку user_id в подзапросах, если вам нужно получить общее кол-во записей по типам из таблицы example.
SELECT count(e.id) "кол-во записей example со статусом 1",
       (
           select count(type_id)
           from example e_1
           where type_id = 1
              and e_1.status = 3
       ) "кол-во для типа 1",
       (
           select count(type_id)
           from example e_3
           where type_id = 3
              and e_3.status = 3
       ) "кол-во для типа 3",
       (
           select count(type_id)
           from example e_4
           where type_id = 4 
            and e_4.status = 3
       ) "кол-во для типа 4"
FROM example e
WHERE e.status = 1
     and e.user_id = 53;

Если получаемая статистика в пределах одного пользователя, то можно использовать такую конструкцию:
SELECT count(e.id) "кол-во записей example со статусом 1",
             count(case when e.type_id = 1
              and e.status = 3 then 1 end)  "кол-во для типа 1",
       count(case when e.type_id = 3
              and e.status = 3 then 1 end)  "кол-во для типа 3",
     count(case when e.type_id = 4
              and e.status = 3 then 1 end)  "кол-во для типа 4"
FROM example e
WHERE e.status = 1
     and e.user_id = 53;

Вариант 3.
SELECT count(case when e.status = 1 then 1 end) "кол-во записей example со статусом 1",
             count(case when e.type_id = 1
              and e.status = 3 then 1 end)  "кол-во для типа 1",
       count(case when e.type_id = 3
              and e.status = 3 then 1 end)  "кол-во для типа 3",
     count(case when e.type_id = 4
              and e.status = 3 then 1 end)  "кол-во для типа 4"
FROM example e
where e.user_id = 53

Вариант 4.
-- Считаем статус 1, игнорируем типы
SELECT 'with_status_1' type_query, null type_id, count(*) cnt
FROM example e
where e.status = 1
and e.user_id = 53
union all
-- Считаем остальные типы со статусом 3
SELECT 'with_another_types' type_query, e.type_id, count(*) cnt
FROM example e
where e.status = 3
and e.user_id = 53
group by e.type_id
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Правда такой запрос вернёт 3 записи, с разными type_id.
И общее кол-во нужно будет суммировать самостоятельно из этих 3-х записей.
SELECT COUNT(*) AS cnt, type_id
FROM example
WHERE user_id = 53 AND status = 1
GROUP BY type_id
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы