2014-03-02 79 views
0

我試圖建立一個SQL查詢,應該吐出所有的用戶活動,而不是總結或任何東西,只是執行每項活動的完整列表。MySQL GROUP BY的問題

我遇到的問題是,我似乎無法得到GROUP BY的工作,以便打印出每個用戶的活動。

SQLFiddle = http://sqlfiddle.com/#!2/5dce6/2

最後,我要建立這個JSON對象:

users: [{ 
    userid: '1', 
    name: 'John', 
    activities: [{ 
     activity_typeid: 6431, 
     time: "2013-01-01 00:00:00", 
     activity_weight: 20 
     }, { 
     activity_typeid: 6431, 
     time: "2013-01-01 00:00:00", 
     activity_weight: 20 
    }] 
}, { 
    userid: '2', 
    name: Peter', 
    activities: [{ 
     activity_typeid: 6431, 
     time: "2013-01-01 00:00:00", 
     activity_weight: 20 
     } 
    }] 
}]  

SQL:

​​
+0

「GROUP BY」用於將多行組合成一行。如果你想獲得所有用戶的活動,你不需要它。只需循環遍歷結果,並將每行添加爲數組中的對象。 – Barmar

+1

SQL無法直接創建JSON。您需要在應用程序中使用邏輯來創建嵌套數組。 – Barmar

回答

0
SELECT activity_typeid, userid, time, activity_weight, activityname 
FROM activity_entries 
WHERE competitionid = '52a99783c5d6f' AND userid = someuserid 
+0

所以我嘗試過 - 但它沒有列出用戶執行的所有活動 - 請參閱http://sqlfiddle.com/#!2/5dce6/3 – user2656127

+0

您是否知道無法使用「group by」運算符將返回MySQL中的隨機數據:http://www.mysqlperformanceblog.com/2006/09/06/wrong-group-by-makes-your-queries-fragile/ –

+0

那麼你需要改變「WHERE competitionid ='52a99783c5d6f' 「到」WHERE userid = someuser「或者只是添加」WHERE competitionid = compid AND userid = someuser「並丟失組合 –

0

我想你不會在這種情況下,需要GROUP BYORDER BY仍然有意義。例如:

SELECT activity_typeid, userid, time, activity_weight, activityname 
FROM activity_entries 
WHERE competitionid = '52a99783c5d6f' 
ORDER BY userid 

然後您可以循環查詢結果。如果當前數據與以前的數據有不同的userid,則創建新的user對象,否則只需將新的activity添加到現有的user對象的activities

0

我想你想使用group_concat()

SELECT userid, username, 
     group_concat(concat_ws(',', activity_typeid, time, activity_weight) separator '; ') as activities 
FROM activity_entries 
WHERE competitionid = '52a99783c5d6f' 
GROUP BY userid; 

這使活動在一個字符串,每次用分號隔開。各個組件然後用逗號分隔。