日期:2014-05-16  浏览次数:20788 次

请教一个发放奖励的存储过程。
活动期间,玩家好友达到指定数量即可获得心动奖励。只计算“我的好友”内符合要求的好友数量,好友达到5个即完成任务,并可获得10积分,参加积分大抽奖活动。
5个好友 → 经验卡10张
10个好友 →经验卡20张
20个好友 →经验卡30张
现在是我的好友表fiiend_info里面有2个字段,自己的usersn和对方的othersn。通过语句
select usersn,count(*) num from game.friend_info group by usersn;能够得出玩家一共有几个好友,现在想写一个存储过程,每天判断一下玩家好友的数量,如果达到要求就发相应的奖励
我自己设计了一个思路,设置中间表friend_num,里面有字段usersn和num两个,这两个字段作为联合主键,如果玩家好友数量达到5个以上,10个以下就插入 usersn,5 。10个以上,20个以下就插入 usersn 10,20个以上是 usersn,20
现在这个存储过程能实现初步功能,将现在表里面的玩家按照上述要求插入到中间表中,如果再执行存储过程就会因为插入重复数据报错,想问下怎么实现与中间表对比,不要插入已经有的数据。
CREATE PROCEDURE `sp_friend_NUM`(
  )
BEGIN
declare _num int unsigned;
  declare _usersn int unsigned;   
  DECLARE no_more_departments int unsigned;
  DECLARE table_cur CURSOR for
  select usersn,count(*) num from game.friend_info group by usersn;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_departments=1;
  SET no_more_departments=0;   
  OPEN table_cur;
REPEAT
  FETCH table_cur INTO _usersn,_num;
  if (_num>=5)AND (_num<10)
  then insert INTO game.friend_NUM(usersn,num) values(_usersn,5);  
  end if;   
  if (_num>=10)AND (_num<20)
  then insert INTO game.friend_NUM(usersn,num) values(_usersn,10);
  end if;   
if (_num>=20)
  then insert INTO game.friend_NUM(usersn,num) values(_usersn,20);   
  end if;   
 UNTIL no_more_departments
 END REPEAT;
  CLOSE table_cur;
END

这个用游标一条条取数据,或者过于麻烦了,现在是想或者解决插入重复数据的问题,或者另设一种逻辑,实现这个功能。
------解决方案--------------------
该回复于2012-08-04 11:19:00被版主删除
------解决方案--------------------
用MERGE INTO  有就UPDATE  没有就INSERT
------解决方案--------------------
用exception
------解决方案--------------------
用MERGE INTO