我有以下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
当签入和签出更多时,结果应该添加另一行。
答案 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中使用该标识符来获取您想要的多个记录。