数据库:member用户名user 登录次数count 登录时间timeset 序号idaaaa 22 1310344207 1
bbbb 47 1310344208 2
cccc 33 1310344209 3现在要输出三组,分别按 登录次数、注册时间、ID排列,普通写法要写三组,这样给数据库是不是读写压力太大了:
//按登录次数
$query="select * from member order by count Limit 0,100";
$result=mysql_query($query,$db);
while ($arr=mysql_fetch_array($result))
{
$count.="$arr[user]";
}//按注册时间
$query="select * from member order by timeset Limit 0,100";
$result=mysql_query($query,$db);
while ($arr=mysql_fetch_array($result))
{
$timeset.="$arr[user]";
}//按ID
$query="select * from member order by id Limit 0,100";
$result=mysql_query($query,$db);
while ($arr=mysql_fetch_array($result))
{
$id.="$arr[user]";
}请问能不能直接一句搞定?
怎么写?比如
$tr_list = array();
$query="select * from member …… in (count,timeset,id) ? Limit 0,10";
$result=mysql_query($query,$db);
while ($arr=mysql_fetch_array($result))
{
$tr_list_index[$arr[' ? ']] .="$arr[user]";
}具体怎么写,请帮忙,谢谢
bbbb 47 1310344208 2
cccc 33 1310344209 3现在要输出三组,分别按 登录次数、注册时间、ID排列,普通写法要写三组,这样给数据库是不是读写压力太大了:
//按登录次数
$query="select * from member order by count Limit 0,100";
$result=mysql_query($query,$db);
while ($arr=mysql_fetch_array($result))
{
$count.="$arr[user]";
}//按注册时间
$query="select * from member order by timeset Limit 0,100";
$result=mysql_query($query,$db);
while ($arr=mysql_fetch_array($result))
{
$timeset.="$arr[user]";
}//按ID
$query="select * from member order by id Limit 0,100";
$result=mysql_query($query,$db);
while ($arr=mysql_fetch_array($result))
{
$id.="$arr[user]";
}请问能不能直接一句搞定?
怎么写?比如
$tr_list = array();
$query="select * from member …… in (count,timeset,id) ? Limit 0,10";
$result=mysql_query($query,$db);
while ($arr=mysql_fetch_array($result))
{
$tr_list_index[$arr[' ? ']] .="$arr[user]";
}具体怎么写,请帮忙,谢谢
方法是用UNION ALL语句。(SELECT * FROM member ORDER BY count LIMIT 0,100)
UNION ALL
(SELECT * FROM member ORDER BY timeset LIMIT 0,100)
UNION ALL
(SELECT * FROM member ORDER BY id LIMIT 0,100)
然后order by那些东西完全可以用php实现。
提示你两个函数:array_multisort和usort.
要是用php的排序函数来进行,可能不如mysql。
==============================================================
你可以一条语句直接select * from member取出结果运算交给数据库?
这话对oracle等数据应该说可以考虑,对mysql的话要小心,用户量一大,几个整表扫描语句够吃一壶的。
你的意思是把全表读到php里.....? 你知道他表里有多少行?
我的主要意思是,本来order by一个非primary key已经是一次全表扫描了,你认为类似#2楼union all两次全表扫描在数据量大的时候可以这么用么?返回数据是少了,mysql压力却加大了。
或许LZ目前阶段只求功能实现,我的目的最主要是想提个醒,至于能有数据量大的时候,说明站点开始迈入成功了,搞个memcached服务器还不是说上就上,或者单独开一台mysql服务器专做统计也不是不行.
说点实在的,如果是我做这样的东西,在硬件条件一般,在不上缓存服务器的情况下,我做法是建多几个统计表,比如user_orderby_count,限1000条,存储登录次数最多的前1000个用户,每次用户登录啥的就更新这个表的数据,删除用户就把之前第1001条记录从主表更新过来(这个麻烦点,不过是后台操作,可以接受)。
这个问题我是吃过亏的,所以想说的多一点。呵呵
对于非PRIMARY KEY索引(INDEX),
10GB的表(一个系统性能日志记录的表,大概580万条记录),对该索引进行排序速度依然很快,
返回前100条记录的时间在0.045秒左右。
$result=mysql_query($query,$db);
while ($arr=mysql_fetch_array($result))
{
$count.="$arr[user]";
}