表goods:      gid     |  name 
                1        xde
                2        dfdd
                3        东方古国风格
表glist:      lid  |  gid  |   subname         | displayorder
                1        1        三三四四        2
                2        1        扫扫地          12   
                3        2        日方非法        10
                4        2        到噶多个        1
我现在想取出glist表中的lid为2,3两项。
但是SELECT g . * , f . * FROM goods g LEFT JOIN glist f ON g.gid = f.gid ORDER BY g.displayorder DESC limit 2 这个sql取出的结果是错误的。按照goods中的gid升序 取出两条 同时也取出在glist中属于相应gid的一条(取displayorder值最大的一个)
结果应为goods中的1,2 同时也取出glist中的2,3

解决方案 »

  1.   

    SELECT glist.lid,glist.gid,glist.subname,MAX(glist.displayorder) AS displayorder,goods.`name` 
    FROM glist 
    LEFT JOIN goods 
    ON glist.gid=goods.gid 
    GROUP BY glist.gid 
    ORDER BY glist.gid DESC
      

  2.   

    select * from glist a 
    inner join goods b on a.gid=b.gid
    where not exists(select 1 from glist where a.gid=gid and a.displayorder<displayorder)
      

  3.   

    参考下贴中的多种方法http://blog.csdn.net/acmain_chm/article/details/4126306
    [征集]分组取最大N条记录方法征集,及散分....
      

  4.   

    select g.* , f.* FROM goods g left join (select * from glist t where not exists (select 1 from glist where gid=t.gid and displayorder>t.displayorder)) f ON g.gid = f.gid ORDER BY g.displayorder DESC limit 2
      

  5.   

    或者如下效率高一点儿。select g.* , f.* FROM goods g left join (select * from glist t where not exists (select 1 from glist where gid=t.gid and displayorder>t.displayorder) ORDER BY displayorder DESC limit 2) f ON g.gid = f.gid