将一组行在2个varchar值之间分组

时间:2015-05-13 13:25:33

标签: mysql

我有以下MySQL表

string.Format

我想查询2个不同活动(签入和结帐)之间的user_id,location_id,date,SUM(points),但我无法弄清楚如何。 应允许签入和结账之间的任何活动。

1   id  mediumint(9)
2   user_id mediumint(9)
3   location_id mediumint(9)
4   timestamp   timestamp
5   activity    varchar(100)
6   points  mediumint(9)

这个集合的结果应该是:

1   38  13  2015-05-13 13:26:01 checkin 100
2   38  13  2015-05-13 13:26:07 add_points  5
3   38  13  2015-05-13 13:26:13 add_points  5
4   38  13  2015-05-13 13:26:19 add_points  5
5   38  13  2015-05-13 13:26:26 add_points  5
6   38  13  2015-05-13 13:26:31 add_points  5
7   38  13  2015-05-13 13:26:37 add_points  5
8   38  13  2015-05-13 13:33:42 checkout    0

当签入和签出更多时,结果应该添加另一行。

2 个答案:

答案 0 :(得分:3)

http://sqlfiddle.com/#!9/ba90b/2

SELECT t.*,
   SUM(t.points)
FROM (
  SELECT *,
   IF(activity='checkin', @gr:=CONCAT(user_id,`timestamp`), @gr) gr,
   IF(activity='checkout', @gr:=null, @gr)
FROM table1
ORDER BY user_id,`timestamp`) t
GROUP BY t.gr

答案 1 :(得分:0)

我想这会做,因为你还总结了checkin(100)和checkout(0)的要点。

我认为用户ID和位置是一个独特的组合,否则你必须确实使用日期。

SELECT userid
,      location
,      DATE_FORMAT(date,'%m-%d-%Y')
,      sum(points) total_points
FROM table
GROUP BY userid
,        location
,        DATE_FORMAT(date,'%m-%d-%Y');

如果有多个签入/签出具有相同的用户ID和位置,则可以考虑向表中添加会话等列或其他唯一标识符。它使查询更容易。您可以在GROUP BY中使用该标识符来获取您想要的多个记录。