1)你合计的时候为何要插入那条记录,我们SHOW是有办法这样SHOW,但实际上,即便你INSERT,记录还是在表的尾部的。
2)分页的时候不截断同一类别不大明白。假设你一页允许40笔,但1类的资料就有50笔,你能不分页吗?那如果要分页,不就要截断了?
如果你不分页,那打印肯定有问题。
但是可在你的分页判断那边加个and 条件,就是当前的类是不是等于前面定义的类变量。我不知道你是怎么分类的。我习惯
select .... where 1<2 order by id;(假设要以ID进行分类)
$quy = mysql_query($sql);
$i = 0;
while( $value = mysql_fetch_array($quy) ){
    $id = $value[id];
    @mysql_data_seek($quy,$i);
    while( $value1 = mysql_fetch_array($quy) and $value1[id] == $id ){
        //过程语句
        $i++;
    }
    @mysql_data_seek($quy,$i);
    //显示类别合计
}

解决方案 »

  1.   

    select .... where 1<2 order by id;(假设要以ID进行分类)
    $quy = mysql_query($sql);
    $i = 0;
    while( $value = mysql_fetch_array($quy) ){
        $id = $value[id];
        unset($string);
        $j = 0;
        $count = 0;
        @mysql_data_seek($quy,$i);
        while( $value1 = mysql_fetch_array($quy) and $value1[id] == $id ){
            //过程语句
            $count += $value1[合计];
            $string[$j] = "<tr><td>值1</td><td>值2</td><td>值3</td><td></td></tr>";
            $i++;
            $j++;
        }
        @mysql_data_seek($quy,$i);
        $last_line = $string[$j-1];
        $last_line = substr($last_line,0,(strlen($last_line)-11));
        $last_line.= $count."</td></tr>";
        $string[$j-1] = $last_line;
        for( $k = 0;$k < $j;$k ++){
           echo $string[$k];
        }
        //显示类别合计
    }
    处理最后一行写的比较笨,看其他学者有没有更好一点的。
      

  2.   

    SELECT SUM(数量),  SUM(单价) FROM 表格 GROUP BY 种类 ORDER BY 种类建议不懂的去学学数据库原理,数据库的结构设计要避免冗余性,统计信息没必要放入数据库结构,
    除非有特殊需求或者性能要求
      

  3.   

    我都说过我不是要把合计放进数据库里,只是显示出来而已。现在的问题是怎样在当前的循环里与下一条记录的数据做比较,这就是我的需求!!!请Meteorlet看清再说,难道我连“SELECT SUM(数量),  SUM(单价) FROM 表格 GROUP BY 种类 ORDER BY 种类”这语句都不懂吗?
      

  4.   

    对于楼主的第一次的要求格式
    sql串写做
    select 类别, 产品, 数量, 单价, 价格 from tbl_name
    union
    select 类别, '合计' as 产品, sum(数量) as 数量, 0 as 单价, sum(价格) as 价格
      from tbl_name
      group by 类别
    order by 类别对于楼主的第二次的要求格式,不能简单的用sql实现
    考虑到可能对所用数据库的不了解或某些需要的功能数据库不提供。个人倾向于只做简单的数据库查询,而用php完成统计工作sql串写做
    select 类别, 产品, 数量, 单价, 价格
     from tbl_name
     order by 类别$rs为查询结果资源
    数据库假定为mysql

    $类别 = -1;
    $数量 = 0;
    $合计 = 0;
    while($row = mysql_fetch_array($rs)) {
      if($类别 != $row['类别']) {
        if($合计) {
          输出合计行
        }
        $数量 = 0;
        $合计 = 0;
        $类别 = $row['类别'];
      }
      $数量 += $row['数量'];
      $合计 = $row['合计'];
      输出数据行;
    }
    输出合计行对于第二种格式  
    $类别 = -1;
    $数量 = 0;
    $合计 = 0;
    while($row = mysql_fetch_array($rs)) {
      if($类别 != $row['类别']) {
        if($合计) {
          输出数据行;
          输出合计列
        }
        $数量 = 0;
        $合计 = 0;
        $类别 = $row['类别'];
      }else {
        输出数据行;
        输出空合计列
      }
      $数量 += $row['数量'];
      $合计 = $row['合计'];
    }
    输出合计列
      
      

  5.   

    to: xuzuning(唠叨)
    现在不用再考虑第一种格式了,我看过了你的代码,总觉得合计列会显示在下一类别的第一行7楼水米应该就可以实现,不过正如他自己说的,最后处理是笨了一点,而且用截取字符串的方法可能会很容易出错,导致页面乱78糟。再看看有没有高手指点
      

  6.   

    呵呵,因为只想用一个SQL处理。
    不然你也可以这么处理
    select .... where 1<2 order by id;(假设要以ID进行分类)
    $quy = mysql_query($sql);
    $i = 0;
    while( $value = mysql_fetch_array($quy) ){
        $id = $value[id];
        unset($string);
        $j = 0;
        $count = 0;
        @mysql_data_seek($quy,$i);
        while( $value1 = mysql_fetch_array($quy) and $value1[id] == $id ){
            //过程语句
            $count += $value1[合计];
            $string[$j] = "<tr><td>值1</td><td>值2</td><td>值3</td><td>zalvsa</td></tr>";
            $i++;
            $j++;
        }
        @mysql_data_seek($quy,$i);
        $last_line = str_replace("zalvsa",$count,$string[$j-1]);
        
        for( $k = 0;$k < $j;$k ++){
           echo str_replace("zalvsa","",$string[$k]);
        }
        //显示类别合计
    }
    我先前不采用str_replace是觉得这样的话变成要再重新对数组的每项进行赋值,是否会影响了速度。
      

  7.   

    那如果值1、值2、值3刚好是“zalvsa”,那不也一齐被replace了??
      

  8.   

    你要这么说,我也真的没招了,能用来做标志的当然你要拿一个出现概率为0的,我也真的就不信,会出现zalvsa.其他奇怪的字符串还一大把。LZ你要砖牛角尖,我也没招。至少我想不出单SQL,遍历一次数据表的还能有比那个速度更快的了。