问题描述
- sql句子查询求大神解决
-
具体的我忘了,大致意思是,一个网站签到,第一天给1积分第二天给2积分,第三天给3积分。。。。。到第六天为止,其中如果忘签到一天,则下次从第一天开始计算,问这个人一共的多少积分?? 如果用存储过程怎么写
日期
2016-1-01, 2016-1-02,2016-1-03,2016-1-04,2016-1-05,2016-1-06,
2016-1-07,2016-1-08,2016-1-10,2016-1-11,2016-1-12,2016-1-13,
2016-1-15,2016-1-17,2016-1-18
解决方案
这个好办,写个递归函数
int <函数名>(<日期>)
{
int result=0;
if(<今日是否签到>)
{
result+=<函数名>(<昨日日期>)+1;
}else
{
result=0;
}
return result;
}
把六天的条件和累计条件写进去
解决方案二:
提供一种思路:如果你这个是第六天后有从一开始算的话,先把所有的数据存数组或者临时表都可以,查询前面连续的天数+1,然后对6取余,最后所有想加。如果连续的第7天是7的话,查询前面的天数+1,最后所有的想加即可。PS:不是很清楚你这里连续6天后是重头计算还是,从1开始。
解决方案三:
这个语句得到签到某天,前5天签到情况,为了简化说明,把日期字段当作数字来处理,你自己可以替换成实际的计算日期天数差的函数
select d
,(select count(*) from t where d=t1.d-1) d1
,(select count(*) from t where d=t1.d-2) d2
,(select count(*) from t where d=t1.d-3) d3
,(select count(*) from t where d=t1.d-4) d4
,(select count(*) from t where d=t1.d-5) d5
from t t1
然后你就可以用case自己计算了
select d,
case d1 when 1 then case d2 when 1 then case d3 when 1 then
case d4 when 1 then case d5 when 1 then 6 else 5 end
else 4 end else 3 end else 2 end else 1 end
from 刚才查询
就是每天的积分获得,然后你自己sum一下就是全部积分了
解决方案四:
加一个字段 连续签到天数:n
根据n 计算一下就行了, 前台还可展示一下 连续签到天数