【问题标题】:Mysql counting join table OneToManyMysql计数连接表OneToMany
【发布时间】:2018-03-31 07:59:03
【问题描述】:

任务:

id | title   | description | 
---------------------------------------------------------------------
 1 | Task1   | Descr1      | 
 2 | Task2   | Descr1      | 
 3 | Task2   | Descr1      | 
 4 | Task2   | Descr1      | 
 5 | Task2   | Descr1      | 

消息:

id | task_id | message   | status |
---------------------------------------------------------------------
 1 | 1       | Message1  | HOLD
 2 | 1       | Message2  | OK
 3 | 1       | Message3  | ERROR
 4 | 1       | Message4  | ERROR
 5 | 2       | Message5  | HOLD
 6 | 2       | Message6  | OK
 7 | 2       | Message7  | OK
 8 | 2       | Message7  | OK
 9 | 3       | Message7  | OK

我想在这里显示:

id | title   | description | count(HOLD) | count(OK) | count(ERROR)
---------------------------------------------------------------------
 1 | Task1   | Descr1      | 1           | 1         | 2
 2 | Task2   | Descr1      | 1           | 3         | 0
 3 | Task2   | Descr1      | 0           | 1         | 0
 4 | Task2   | Descr1      | 0           | 0         | 0
 5 | Task2   | Descr1      | 0           | 0         | 0

【问题讨论】:

    标签: mysql sql join left-join


    【解决方案1】:

    你可以在 sum 和 CASE 上使用选择性聚合

      select  task.id
        , task.title  
        , task.description
        , sum(case when Message.status = 1 then 1 else 0 end )  status1
        , sum(case when Message.status = 2  then 1 else 0 end )  status2
        , sum(case when Message.status = 3  then 1 else 0 end )  status3
    from Task
    INNER JOIN Message ON Task.id = Message.task_id
    group by task.id
        , task.title  
        , task.description
    

    【讨论】:

      【解决方案2】:

      另一种方式

      SELECT task.id, task.title, task.description,
      
      SUM(DECODE (status, 'HOLD',1,0 end)) AS "HOLD_COUNT"
      SUM(DECODE (status, OK,1, 0 end)) AS "OK_COUNT"
      SUM(DECODE (status, ERROR,1, 0 end ) AS "ERROUR_COUNT"
      
      FROM task
      JOIN Message ON Task.id = Message.task_id
      group by task.id, task.title  , task.description
      

      【讨论】:

        【解决方案3】:

        我认为正确的解决方案是:

        select t.id, t.title, t.description,
               coalesce(sum( m.status = 'Hold' ), 0) as num_hold,
               coalesce(sum( m.status = 'OK' ), 0) as num_ok,
               coalesce(sum( m.status = 'Error' ), 0) as num_error
        from task t left join
             message m
             on m.task_id = t.id
        group by t.id, t.title, t.description;
        

        【讨论】:

          猜你喜欢
          • 2017-03-07
          • 2012-02-12
          • 2015-11-25
          • 1970-01-01
          • 1970-01-01
          • 2017-04-06
          • 1970-01-01
          • 1970-01-01
          • 2012-11-23
          相关资源
          最近更新 更多