Mysql计数连接表OneToMany

时间:2018-03-31 07:59:03

标签: mysql sql join mysqli left-join

任务:

BackgroundWorker backgroundWorker = new BackgroundWorker(getActivity().getApplicationContext());
backgroundWorker.execute();

消息:

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

3 个答案:

答案 0 :(得分:3)

时,你可以在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

答案 1 :(得分:1)

另一种方式

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

答案 2 :(得分:1)

我相信正确的解决方案是:

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;