数据库: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]";
}具体怎么写,请帮忙,谢谢

解决方案 »

  1.   

    这个其实我也有用到过这种情况
    方法是用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)
      

  2.   

    我想问能不能一句搞定?$query="select * from member …… in (count,timeset,id) ? Limit 0,10";这样的怎么写,怎么输出?
      

  3.   

    你可以一条语句直接select * from member limit 0, 100取出结果
    然后order by那些东西完全可以用php实现。
    提示你两个函数:array_multisort和usort.
      

  4.   

    排序的工作还是交给mysql来做比较好,如果建立了索引,mysql的排序速度很快的。
    要是用php的排序函数来进行,可能不如mysql。
      

  5.   

    这种sql语句,除了primary key,order by肯定会用到Using filesort,那就是一个整表扫描.
      

  6.   

    看需求呗,如果性能瓶颈在I/O,就让php来排序,如果性能瓶颈在运算上,感觉交给mysql好一些
      

  7.   

    你可以一条语句直接select * from member limit 0, 100取出结果
    ==============================================================
    你可以一条语句直接select * from member取出结果运算交给数据库?
    这话对oracle等数据应该说可以考虑,对mysql的话要小心,用户量一大,几个整表扫描语句够吃一壶的。
      

  8.   


    你的意思是把全表读到php里.....?  你知道他表里有多少行?
      

  9.   

    mysql里面最好不要进行计算,性能伤不起……
      

  10.   

    如果表数据实在太大,表分表,分区,数据缓存什么的都该上了。
    我的主要意思是,本来order by一个非primary key已经是一次全表扫描了,你认为类似#2楼union all两次全表扫描在数据量大的时候可以这么用么?返回数据是少了,mysql压力却加大了。
    或许LZ目前阶段只求功能实现,我的目的最主要是想提个醒,至于能有数据量大的时候,说明站点开始迈入成功了,搞个memcached服务器还不是说上就上,或者单独开一台mysql服务器专做统计也不是不行.
    说点实在的,如果是我做这样的东西,在硬件条件一般,在不上缓存服务器的情况下,我做法是建多几个统计表,比如user_orderby_count,限1000条,存储登录次数最多的前1000个用户,每次用户登录啥的就更新这个表的数据,删除用户就把之前第1001条记录从主表更新过来(这个麻烦点,不过是后台操作,可以接受)。
    这个问题我是吃过亏的,所以想说的多一点。呵呵
      

  11.   

    不过我这里测试,
    对于非PRIMARY KEY索引(INDEX),
    10GB的表(一个系统性能日志记录的表,大概580万条记录),对该索引进行排序速度依然很快,
    返回前100条记录的时间在0.045秒左右。
      

  12.   

    怎么输出呢?
    $result=mysql_query($query,$db);
    while ($arr=mysql_fetch_array($result))
    {
    $count.="$arr[user]";
    }