2016-01-21 60 views
2

我需要获得很多值的总和与来自SQL查询相同的密钥。 例如...说我有30行从查询返回,他们看起来像这样。SQL如何总结许多记录键:值对?

1) (a:2), (b:4),(f:1), (h:3) 
2) (c:2), (f:4),(t:1), (z:3) 
3) (a:5), (b:2),(s:1), (z:3) 
4) (d:2), (g:4),(s:1), (t:3) 
and so on.... 

我需要做的是总结所有的“a”,所有的“b”和所有“C”等 并把所有到一个数组或对象,以便我可以访问他们以后处理。

$总= [(A:7),(B:6),(C:2),(d:2).....(Z:6)];

有没有办法做到这一切从SQL?或者我必须使用PHP对外部所有这些记录进行求和?

这是我的SQL代码,以获得30个记录......

while($row = mysql_fetch_array($rs)) { 
$queryActivity = "SELECT activity, count(activity) FROM users u, activities_users au, activities a WHERE ($row[zip] = u.zip AND u.id = au.user_id AND au.activity_id = a.id) GROUP BY a.activity"; 
$rs2 = mysql_query($queryActivity); 
while($row2 = mysql_fetch_array($rs2)) { 
echo "<tr><td>$row2[0]</td><td>"; 
echo "<tr><td>$row2[1]</td><td>";} 

它返回的所有活动和这些活动的一定邮编总和。我只需要为每项活动总计所有款项。

+0

你的意思是像'SUM'和'GROUP BY'的组合? – frz3993

+0

1,2,3,4 - 这些行?它是每列一列还是每列四列? – Andrew

+0

1,2,3,4是行.....在我的例子中每行4列。在实际使用中,它可以是30行,最多170列,每列都有唯一的密钥。有些行可能有一列,有些可能有多达170列。和其他行之间的任何东西。复杂的查询吧? – whitelight

回答

1

为(a:2),(B:4)......在数据库中的行?

您将需要使用某种分裂,SUM,以及GROUP BY的。在我们获得更多信息之前,这将很难提供帮助。

所以这里是一个快速的查询,将通过行的第一子组。你可以为其他子集做同样的事情。我不知道有什么方法可以在纯粹的MySQL中执行您想要的操作。

SELECT 
    SUBSTRING(activity, 1,2), 
    count(activity) 
FROM users u, activities_users au, activities a 
WHERE ($row[zip] = u.zip AND u.id = au.user_id AND au.activity_id = a.id) 
GROUP BY SUBSTRING(activity, 1,2) 
+0

这不是问题的有用答案,更适合作为评论。 – miken32

+0

是...那些是DB中的行。每行可能包含0到170个不同的Key:Value对。所有INT有170个不同的键和任意数量的值。这更清楚了吗? – whitelight

+0

thomas_Ird的这个解决方案完全符合我的查询要求。它只是返回我30行,如我前面所述。 – whitelight

0

我不确定我完全理解您的要求,但您可以在sql中使用SUM()方法。

SELECT SUM(column_name) FROM table GROUP BY column_name 
0

组后添加WITH ROLLUP到您的查询BY子句:

SELECT activity, count(activity) 
    FROM users u, activities_users au, activities a 
    WHERE ($row[zip] = u.zip AND u.id = au.user_id AND au.activity_id = a.id)  
GROUP BY a.activity WITH ROLLUP 

这将增加一个额外的行(空,totalsum)到你需要PHP来处理结果集。

作为替代方案,你可以用PHP计算的话你的while循环中:

$total[$row2[0]] = (empty($total[$row2[0]]) ? 0 : $total[$row2[0]]) + $row2[1] 
+0

WITH ROLLUP让我更接近。它显示每行的总和。但我需要的是所有30行的每项活动的总数。 – whitelight