2012-07-11 40 views
0

我有2个表MySQL查询(其中和基团)

tbl_activities

id | activity 
1 | activity1 
2 | activity2 

tbl_sub_activities

id |activityId | subActivity | status 
1 | 1   | subActivity1 | done 
2 | 1   | subActivity2 | done 
3 | 1   | subActivity3 | ongoing 
4 | 2   | subActivity4 | done 
5 | 2   | subActivity5 | done 

方案: 一个活动可以有很多的子活动。

如果子活动的状态全部完成,那么活动完成,如果子活动的状态仍然存在,则活动正在进行, 。

问题: 如何查询tbl_activities以获取像这样的输出。

id | activity | status 
1 | activity1 | ongoing 
2 | activity2 | done 

我已经做了这个使用PHP,但我想知道如何做到这一点使用SQL查询。

回答

3

根据模型,你可以用这个真的高性能查询:

SELECT 
    a.id, 
    a.activity, 
    MAX(s.status) as status 
FROM tbl_activities a 
INNER JOIN tbl_sub_activities s ON s.activityId = a.id 
GROUP BY a.id; 

但要注意,这是模型依赖MAX(statuts)总会给ongoing除非所有子activites是done ;-)

对于您可以考虑这种模式不太依赖型号查询:

SELECT 
    a.id, 
    a.activity, 
    SUM(s.status = "ongoing") as NB_ONGOING, 
    SUM(s.status = "done") as NB_DONE 
FROM tbl_activities a 
INNER JOIN tbl_sub_activities s ON s.activityId = a.id 
GROUP BY a.id; 
+0

您可能要包括'在a.activity'了' GROUP BY'只是为了更贴合标准。另外,'statuts'拼写错误。除了那些东西,这看起来很棒。 – 2012-07-11 10:51:39

+0

Ups,感谢拼写Zane :)至于'GROUP BY'中的'a.activity',我完全同意这个标准,但仍然不愿意这样做,因为我还没有人际关系性能问题的基准:/ – 2012-07-11 10:54:58

+0

@赞:有标准和标准。 – 2012-07-11 11:18:54

1

如果只有两个状态完成和正在进行那么这个查询可能对你的作品

Select a.id,a.activityid,b.status 
    from tbl_activities a 
    inner join tbl_sub_activities b on a.id=b.activityid 
    Group by a.id order by b.status DESC 
1

为了更好地:

SELECT 
    a.id, 
    a.activity, 
    case when SUM(s.status = "done") = count(s.status) 
     then "DONE" else "ONGOING" 
    END 
FROM tbl_activities a 
INNER JOIN tbl_sub_activities s ON s.activityId = a.id 
GROUP BY a.id; 
+0

我会在这里使用一个较不详细的'IF'而不是'CASE'。我不确定你的情况是否好。你可能找了'SUM(s.status =“done”)= COUNT(*)' – 2012-07-11 11:04:54

+0

okays ..你可以使用'IF' :)修正它。谢谢哥们 !! – manurajhada 2012-07-11 11:13:08