0

我有两张桌子

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 查询来完成这项工作。

4

3 回答 3

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)将始终给出ongoingdone

对于较少依赖模型的查询,您可以考虑以下模式:

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;
于 2012-07-11T10:45:41.503 回答
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
于 2012-07-11T10:57:47.900 回答
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;
于 2012-07-11T11:01:54.400 回答