SQL如何总结许多记录键:值对?

时间:2016-01-21 19:05:30

标签: php sql

我需要从SQL查询中获取具有相同键的许多值的总和。 例如......假设我从查询返回了30行,它们看起来像这样。

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”等 并将所有内容放入数组或对象中,以便我可以访问它们以供以后处理。

$ total = [(a:7),(b:6),(c:2),(d:2).....(z:6)];

有没有办法从SQL执行此操作?或者我是否必须使用PHP在外部对所有这些记录求和?

这是我获取30条记录的SQL代码......

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>";}

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

3 个答案:

答案 0 :(得分:1)

是(a:2),(b:4)......是数据库中的一行吗?

您需要使用某种split,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)

答案 1 :(得分:0)

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

SELECT SUM(column_name) FROM table GROUP BY column_name

答案 2 :(得分:0)

在GROUP BY子句后将WITH ROLLUP添加到您的查询中:

  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

它会在你需要在PHP中处理的结果集中添加一个额外的行(null,totalsum)。

作为替代方案,您可以在while循环中使用PHP计算它:

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