【问题标题】:Get Total Count from Current Status Query从当前状态查询中获取总计数
【发布时间】:2019-07-09 10:43:47
【问题描述】:

我在计算 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

谢谢大家...

【问题讨论】:

    标签: mysql sql database database-design relational-database


    【解决方案1】:

    使用子查询得到如下:

    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
    

    【讨论】:

      【解决方案2】:

      一个简单的选择是只包装您当前的聚合查询,然后通过 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;
      

      请注意,我在查询中引入了表别名以便于阅读。

      【讨论】:

        【解决方案3】:

        首先,您应该修复您的查询,以便计算“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;
        

        【讨论】:

        • 这是什么意思 t in LEFT JOIN m_ticket t ON t.ticket_served_by = sss.user_id AND t.ticket_status in (4, 5, 6), 以防万一 count(t.ticket_served_by)已经被使用了 t
        • @aldi 。 . . t 是表别名。它是 SQL 的一个非常基础的部分。
        猜你喜欢
        • 1970-01-01
        • 2019-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        相关资源
        最近更新 更多