很久没发过技术贴了,都在灌水。今天发个排名的东东吧。
这个程序主要是处理类似用户排名、博客排名这样的情况的,一般是前100或者1000名吧,表中的数据量不会很大,当然需要根据你的实际情况需要修改某些地方。效果类似附件部分
下面是程序部分
复制内容到剪贴板
代码:
<?php
/*
* Author: Archon [email=enze@vip.qq.com]enze@vip.qq.com[/email]
*/
/**
* ***************************
* 数据库表order字段
* id、userid 、hits、order、show
* 数据库表order_old字段
* id、userid 、hits、order、show
* 需要用到两个表,这两个表字段一模一样
* 可选表为需要排序的原始表
*/
class LibDataBase
{
function __construct()
{
//********
}
function __destruct()
{
//************
}
function changeDb($db)
{
//************
}
function exec($db)
{
//**************
}
//****************封装了PDO类库,新增了选择不同数据库服务器的数据库及数据表功能
//数据是以散列的库表存放
}
$lib_db=new LibDataBase();
/**
* **************************
* 提取用户数据,并取得排名趋势
* @param int $mode
*/
function setUser($mode=1)
{
global $lib_db;
//转移order数据到order_old中
$lib_db->changeDb('user_total'); //选择目标数据库
$sql="replace into `order_old` select * from `order` ";
$lib_db->exec($sql); //执行SQL
sleep(3); //暂停3秒等待mysql处理
//清空order表
$lib_db->exec("truncate table `order`");
//插入数据 这个函数中会选择源数据库
setTotalUserData('user','user','user','user','userid,hits','`power` = 0','user_total','`order`',$mode,100);
sleep(3);
//计算并比较排名
updateUserOrder();
}
/**
* ********************
* 更新排名
*/
function updateUserOrder()
{
global $lib_db;
//重新选择目标数据库
$lib_db->changeDb('user_total');
//获取order中有多少数据
$num=$lib_db->getRow("select count(*) as num from `order`");
$sql="select `userid` from `order` order by hits desc";
//按点击率递减取得数据,数组,二维
$res=$lib_db->getAll($sql);
$i=1; //初始化排名
foreach ($res as $key=>$val)
{
//取得排名变化情况
$show=comParaUserOrder($val['userid'],$i);
$sql="update `order` set `order` = ".$i.",`show` = ".$show." where `userid` = ".$val['userid'];
$lib_db->exec($sql);
$i++;
}
}
/**
* ******************
* 取得排名变化情况
* @param int $uid
* @param int $order
* @return int
*/
function comParaUserOrder($uid,$order)
{
global $lib_db;
//计算old排名
$sql="select `order` from `order_old` where `userid` = ".$uid." limit 1";
//取得一条记录
$res=$lib_db->getRow($sql);
//比较两个排名 2为下降 1为上升 0为不变
//这里排名的大小和老大、老二、老三这样的比较类似
if($res['order']<$order)
{
$show=2;
}
elseif($res['order']>$order)
{
$show=1;
}
else {
$show=0;
}
return $show;
}
/**
* **************************************************************
* 从分库中提取数据到total库中
* @param string $dbcfg 配置文件中的DB
* @param string $key 配置文件中的数组下表
* @param string $sdb 源数据库
* @param string $stb 源数据表
* @param string $filed 字段
* @param string $where 查询条件
* @param string $tdb 目标数据库
* @param string $ttb 目标数据表
* @param int $mode 调用模式 0为WEB方式,1为SHELL调用
* @param int $limit 记录条数
* @param string $order 排序字段,这里都是倒排
* @param int $join 0为没有联合查询 1有联合查询
* @param string $stb1 join为1的时候传入的数据表
* @return bool 返回true/false
*/
function setTotalUserData($dbcfg,$key,$sdb,$stb,$filed,$where,$tdb,$ttb,$mode=1,$limit=10,$order='hits',$join=0,$stb1='')
{
global $lib_db;
//从分库中提取数据到total库中的一系列操作
}
//调用
setUser();
?>
[
本帖最后由 enze 于 2008-3-5 23:29 编辑 ]