用PostgreSQL的话:
SELECT name FROM table
Join
(
SELECT name,MAX(rank) FROM table GROUP BY name
) AS foo
USING  name

解决方案 »

  1.   

    我不熟悉MySQL,但思路是这样的,你看看能不能翻译过去
      

  2.   

    rank如果只有0和1的话还好办,可以:
    select * from table group by name having count(distinct rank)=1 union select * from table where rank='1' group by name;
    否则可能需要用临时表。
    如果支持子查询的话一个语句就比较好写了。
      

  3.   

    不错,强!!!
    但我觉得这样会更合理:
    select * 
    from table 
    group by name 
    having max(rank)=0  
    union 
    select * 
    from table 
    where rank='1'
    group by name;因为用count(distinct rank)=1来限定,有可能是一个name只有一个值,而刚好这个值为1,这样“Union”前后的都有找到这个值,如果记录较多,可能会影响性能。
      

  4.   

    你可以看一下这个FAQ
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=6420
      

  5.   

    那么,该题可以如下解决:select 
    substring(max(concat(name,rank,lpad(id,4,'0'))),3,4)+0 as id,
    name,
    substring(max(concat(name,rank,lpad(id,4,'0'))),2,1)+0 as rank
    from source
    group by name谢谢犬犬,偶又学了一招。