商品排行榜,原来是只记录了用户的投票数,通过order by 投票数来实现排行,但现在需要制作一个查询功能,也就是说用户输入商品的名称,查询出商品的详细情况,这里面包含着商品的排行信息!这样就需要有一个单独的字段来记录排行名次的信息了,这个也好办,问题在于用户还在不停的投票,当名次发生变动时就要对数据库的排行名次字段进行更新,这个应该怎么更新?我记得update语句可以用ORDERY BY来排序吧,$sql='update 表名 set 名次=...... order By 投票数 DESC;那6个点的地方怎么写?就是让名字从1开始自加1,来更新名次字段。还有没有更好的办法?因为现在这样如果商品数很多的话,每次更新都要占用浏览者大量的时间,用户体验非常不好,有没有能够快速更新的办法?只能用纯SQL语句,其他的用不了

解决方案 »

  1.   

    $sql='update goods set mc=(@r_c:=IFNULL(@r_c,0)1) where yn=1 order by votes desc';这样好象不行啊,mc根本没变化。。
      

  2.   

    新办法功力不够,咱用老办法好了mysql_query("set names utf8");
    $q=mysql_query('select * from goods where yn="1" order by votes DESC');
    $js=1;
    while($row=mysql_fetch_array($q)){
    $sql='update goods set mc='.$js.' where id='.$row['id'];
    mysql_query("set names utf8");
    mysql_query($sql);
    $js++;
    }这个倒成功了,但是还是老问题,有没有什么办法在商品数据的量很大时不让网页产生太长时间的延迟
      

  3.   

    把order by votes desc这句删除了,没必要这么加,更新有一个yn即可。数据量大的时候会影响更新速度!
    如果数据量大,还可以增加适当的关键字索引。以加快查找速度,另外可考虑分区分表技术。
      

  4.   

    这样就需要有一个单独的字段来记录排行名次的信息了为什么有这个需求呢?如果是我的话,我到宁愿在每次商品的中使用
    SELECT COUNT(id) + 1 AS ranking FROM 表名 WHERE 投票数 > (SELECT 投票数 FROM 表名 WHERE `name` = '指定商品名'); 来获取名次如果非要加个字段排名的话,可以这样更新,写个存储过程比较好吧
    update 表名 set 名次=(select 名次 from 表名 where 投票数 <= 投票数)where id = 当前商品
    update 表名 set 名次 = 名次 + 1 where 投票数 < 投票数加入值是 3 3 2 1 则是 1 1 3 4 排名
      

  5.   

    不必要记录排名假定投票数记录在商品信息表中 
    查询总排名用
    set @mc:=0;
    select *, @mc:=@mc+1 as mc from 表名 order by mc查询指定商品用
    set @mc:=0;
    select * form (select *, @mc:=@mc+1 as mc from 表名 order by mc) a where 名称='名称'
      

  6.   


    但是怎么写到PHP中呢?报错呢,而且直接复制到MySQLGUITools中并修改表名也报1146的错