Получить общее количество из текущего запроса статуса - PullRequest
0 голосов
/ 15 февраля 2019

У меня проблема с подсчетом общего количества данных о текущем состоянии по запросу MySQL.

Вкратце, у меня есть 3 таблицы, которые связаны друг с другом.

m_shift_schedule     site_shift_schedule      m_ticket
================     ===================     ============
* shift_id   ======>  * shift_id             * ticket_id
* start_time          * shift_date           * ticket_status
* end_time            * user_id   ========>  * ticket_served_by

Мой текущий запрос:

SELECT user_id,
  case when count(m_ticket.ticket_served_by)<2 then 'idle' 
     when count(m_ticket.ticket_served_by)=2 then 'Busy' 
     when count(m_ticket.ticket_served_by)>2 then 'Overload' end as status
FROM site_shift_schedule
LEFT JOIN m_shift_schedule ON site_shift_schedule.shift_id = m_shift_schedule.shift_id
LEFT JOIN m_ticket ON site_shift_schedule.user_id=m_ticket.ticket_served_by
   WHERE site_shift_schedule.shift_date =  '2019-02-11' and m_ticket.ticket_status in (4,5,6)
group by user_id

Мой вывод из вышеприведенного запроса:

 user_id                           Status
 =============================   ============
 ismail.rahman.saanin@random.co     Idle
 lutfi.aldi.nugroho@random.co       Busy
 tb.makkiy@yihuu.co                 Overload

И вопрос: что мне делать, если я хочу, чтобы вывод получился таким:

Idle                 1
Busy                 1
Overload             1

Спасибо, ребята...

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Один простой вариант - обернуть текущий запрос агрегирования и затем агрегировать по вычисляемому столбцу status:

SELECT
    t.status,
    COUNT(*) AS cnt
FROM
(
    SELECT user_id,
       CASE WHEN COUNT(mt.ticket_served_by) < 2 THEN 'idle' 
            WHEN COUNT(mt.ticket_served_by) = 2 THEN 'Busy' 
            WHEN COUNT(mt.ticket_served_by) > 2 THEN 'Overload' END AS status
    FROM site_shift_schedule ss
    LEFT JOIN m_shift_schedule ms ON ss.shift_id = ms.shift_id
    LEFT JOIN m_ticket mt ON ss.user_id = mt.ticket_served_by
    WHERE ss.shift_date = '2019-02-11' AND mt.ticket_status in (4,5,6)
    GROUP BY user_id
) t
GROUP BY
    t.status;

Обратите внимание, что я ввел псевдонимы таблиц в запросе, чтобы его было легче читать.

0 голосов
/ 15 февраля 2019

Во-первых, вы должны исправить свой запрос так, чтобы он насчитывал «0» строк:

SELECT user_id,
       (case when count(t.ticket_served_by) < 2 then 'idle' 
             when count(t.ticket_served_by) = 2 then 'Busy' 
             when count(t.ticket_served_by) > 2 then 'Overload'
        end) as status
FROM site_shift_schedule sss LEFT JOIN 
     m_shift_schedule ss
     ON sss.shift_id = ss.shift_id LEFT JOIN
     m_ticket t
     ON t.ticket_served_by = sss.user_id AND
        t.ticket_status in (4, 5, 6)
WHERE sss.shift_date = '2019-02-11' 
GROUP BY user_id;

В противном случае ваш WHERE превращает внешнее соединение в левое соединение.

Сэто, вы можете получить то, что вы хотите с дополнительным уровнем агрегирования:

SELECT status, count(*)
FROM (SELECT user_id,
             (case when count(t.ticket_served_by) < 2 then 'idle' 
                   when count(t.ticket_served_by) = 2 then 'Busy' 
                   when count(t.ticket_served_by) > 2 then 'Overload'
              end) as status
      FROM site_shift_schedule sss LEFT JOIN 
           m_shift_schedule ss
           ON sss.shift_id = ss.shift_id LEFT JOIN
           m_ticket t
           ON t.ticket_served_by = sss.user_id AND
              t.ticket_status in (4, 5, 6)
      WHERE sss.shift_date = '2019-02-11' 
      GROUP BY user_id
     ) s
GROUP BY status;
0 голосов
/ 15 февраля 2019

Используйте подзапрос, чтобы получить следующее:

SELECT status,count(user_id) as count from (
SELECT user_id,
  case when count(m_ticket.ticket_served_by)<2 then 'idle' 
     when count(m_ticket.ticket_served_by)=2 then 'Busy' 
     when count(m_ticket.ticket_served_by)>2 then 'Overload' end as status
FROM site_shift_schedule
LEFT JOIN m_shift_schedule ON site_shift_schedule.shift_id = m_shift_schedule.shift_id
LEFT JOIN m_ticket ON site_shift_schedule.user_id=m_ticket.ticket_served_by
   WHERE site_shift_schedule.shift_date =  '2019-02-11' and m_ticket.ticket_status in (4,5,6)
group by user_id)
group by status
...