我想找出 10 条按某种顺序排列好的记录,并以 foo 为 10 条记录的中心点。应该如何操作呢?基本语句类似:select  * from tbl order by win limit 10关键在于如何让这 10 条记录以 id=foo 记录为中间那一个行?

解决方案 »

  1.   


    create temporary table tmp (id int not null auto_increment primary key,其他tbl的字段) select  * from tbl where id = 'foo' order by win desc;select ceiling(max(id) + min(id)/2+1) from tmp into @v_id;
    select * from tmp where id >=@v_id limit 5
    union all
    select * from tmp where id < @v_id limit 5;
      

  2.   

    select * from 
    (
    select * from tbl where win <= (select min(win) from tbl where id='foo') order by win desc limit 6
    union
    select * from tbl where win > (select min(win) from tbl where id='foo') order by win limit 5
    ) as a
    order by win;[align=center]====  ====
    [/align]
      

  3.   

    另外   10 条记录以 id=foo 记录为中间 是不可能的 
    1-10 中间的那个数是几?上面SQL 是   11 条记录以 id=foo 记录为中间[align=center]====  ====
    [/align]
      

  4.   

    谢谢两位。yueliangdao0608: 创建一个临时表会不会增大额外的开销?而影响效率?liuyann: 你的代码我看明白了,就是以 id = foo 行在中间。代码可以正确执行,没有问题。
      

  5.   

    每行各自的排名 难度大了
    要用store precudure 了,不是仅用SQL能做到了,  不象oracle中有rowno[align=center]====  ====
    [/align]
      

  6.   

    恩,我  google 了下, oracle 里面好像直接有 rowno, rank() 之类的东西。我搞了下,用 count(*) 算出 foo 行的 rank, 然后在程序中手动比较,推算解决了。select count(*) + 1 from tbl where Win > (select Win from tbl where id = 'foo');