:)我记得在第一贴中简单的写过:JSP我不会,我觉得没有必要使用一条sql语句实现,我尝试写如下结构:min_value = 100*0.2^6;  //中止循环的最小积分
function add_point(username, x)  //username为当事人,x为其获得分数
{
  uname = username;
  nextname="";  //介绍会员名称
  tmp;  //计算积分
  query1 = "UPDATE tbl_name SET 最终积分=最终积分+tmp WHERE 会员名称=uname";
  query2 = "SELECT 介绍会员 FROM tbl_name WHERE 会员名称=uname"  //计算积分
  while(1)
  {
    if (tmp*0.2 < min_value)
      break;    mysql_query(query2); //得到介绍会员,赋值给nextname    if (nextname == null && uname == username)  //username为一级会员
    {
      tmp = x;
    }
    else if (nextname != null && uname == username)  //username不是一级会员
    {
      tmp = x*0.8;
    }
    else if (nextname != null)
    {
      tmp = 0.2*tmp;
    }
    else  //最后的上级
    {
      tmp = 0.2*tmp/0.8;
    }    mysql_query(query1);
  
    if (nextname == null)
      break;    uname = nextname;
}写的很粗造,见笑!

解决方案 »

  1.   

    mysql相关表中相关字段
    member表 loginName       会员名称
         introducer       介绍会员
         point_total      会员积分
    order表  loginName       会员名称         point           会员自己得到积分
      

  2.   

    if (uname == username)
      query1 = "UPDATE order SET point=point+tmp WHERE loginName=uname";
    else
      query1 = "UPDATE member SET point_total=point_total+tmp WHERE loginName=uname";query2 = "SELECT introducer FROM member WHERE loginName=uname";
    (实际使用时,上述tmp, uname需要经过格式化代替)上面queyr1, queyr2的赋值语句放的地方不对!应该都放在执行mysql_query()语句之前
      

  3.   

    username是不是需要一条语句取得呢
      

  4.   

    就是搜没有成为别人introducer的记录啊
    select * from member where introducer not in
    ( select loginName from member)但是mySql不支持子查询啊不过搜无下级会员没有多大用处啊,以为就算有的会员有下级,但是他也可以加分的啊Sql的递归比较麻烦,楼主稍等,现在忙...回头给你写你的introducer是指向loginName还是loginName 的ID?
      

  5.   

    朋友你慢慢写,对你和小木的帮助我目前真的是无以为报啊
    非常感谢你们,但是我必须还得麻烦你们,因为自己琢磨不透有朋友建议我在MEMBER中加个标志列,0代表无下级,1代表有下级。
    但是我考虑了,往数据库中加这个标志就很费劲,所以不行就不用它了我的想法是,所有会员在一定的时期内(如一个月),都有自己的某一积分,最少为0
    我打算按固定的时期进行一次计算,这样比发生一个积分就计算一次系统负荷应该会
    小些吧。这样加分由管理员手工完成,比较安全
    发生一个积分就计算一次的方法,我想得由会员引发,由系统自动计算,会不会出现
    会员胡乱操作,乱加分的现象。而且出现这样的情况,也不好挽回,至少我暂时没想到
    办法
    请指教
      

  6.   

    :)还是建议你先完成初级版本,定时计算积分也好、实时计算积分也好,从理论上不能说明哪个更适合(总是各自能找到优点和缺点的),只能通过实际应用来判断!对于查询没有下级的会员,在mysql老版本中可以试试如下语句(最新版本已经支持子查询,按挂月的方法查询就行了)select m1.loginName from member m1 left join member m2 on m2.introducer=m1.loginName where m2.introducer is NULL
      

  7.   

    谢谢,我本机上装的是4.0.12,购买的空间上好像是3点几的另外,我的introducer是指向loginName
      

  8.   

    定时计算是个很好的办法,第一可以减少系统的负荷,可以选择一个系统闲职的时间进行数据统计,比如每日一次, 选择凌晨,这样做的后果是数据不能够实时的体现,这就看你们系统具体的要求了order表
    loginName       会员名称
    point           会员自己得到积分
    point_tmp        会员最新积分//计算上级积分函数
    add_point(intro,point_1)
    {
    point_add=point_1*0.2;//0.2为人为设置参数
    update order set point=point+point_add where loginName="intro";
    提交数据库
    select introducer from member where a.loginName="intro";
    add_point(introducer,point_add)
    }
    增加积分个人
    update order set point_tmp=point_tmp+point_new where loginName="用户名";
    //point_new是新加的piont,暂时先存到point_tmp中全体计算积分
    //先把临时的积分加到自己的分数上
    update order set point=point+point_tmp
    //////////计算上级分数开始
    //先取出本次所得分和上级名称
    select b.point_tmp,a.introducer from member a,order b where a.loginName="用户名" and a.loginName=b.loginName ;
    //调用积分函数
    add_point(a.introducer,b.point_tmp);大概意思就是这个,不知道你用的那种语言没有办法写具体的代码,详细的在QQ上说吧