2014-03-02 80 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; 

这使活动在一个字符串,每次用分号隔开。各个组件然后用逗号分隔。