模拟的实际数据:注意红框中存在时间不连续的情况。
第一题的解法:
首先判断@temp_id = user_id (即上一条数据的user_id =当前数据的user_id)是否相同,如果不同,days子弹的值等于attend,即如果签到,就是1,如果不签到就是0 ; 如果相同,在判断attend字段,如果attend = 0,则days重置为0,如果attend = 1,继续判断两个日期间隔是否为1,如果间隔为1,则num自增1,如果间隔不是1天,则num = 1(因为此时attend = 1).
SELECT user_id,date,attend,IF(@temp_id = user_id,if(attend = 0,@num := 0,if(datediff(date,@temp_date) = 1,@num := @num + 1,@num := 1)),@num := attend) AS days,@temp_id := user_id,@temp_date := date FROM (SELECT * FROM visit ORDER BY user_id,date) AS t,(SELECT @temp_id := NULL,@temp_date := NULL,@num := 1) AS q
结果为:
第二题的解法:(在第一题解法得到的表的基础上使用group by排序即可)
SELECT user_id, max(days) AS max_attend_days FROM (SELECT user_id,date,attend,IF(@temp_id = user_id,if(attend = 0,@num := 0,if(datediff(date,@temp_date) = 1,@num := @num + 1,@num := 1)),@num := attend) AS days,@temp_id := user_id,@temp_date := date FROM (SELECT * FROM visit ORDER BY user_id,date) AS t,(SELECT @temp_id := NULL,@temp_date := NULL,@num := 1) AS q) AS org_table GROUP BY user_id;
结果为:
个人觉得解法比较正确,求指教。