2012-07-11 38 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