name     id
       cgk      15
cgs  14
asasd  10
  cgs  9
cgk  8
  cgs  11
  cgs  16
  cgs  17
我想把所有重复的id都查询出来,只保留最小的那个id,我用
select id from test group by name having count(*)>1
很多重复的id都显示不出来,只会把   15,14的id的查询出来,其他的都查询不出来,请指教

解决方案 »

  1.   

    name   id
    cgk    15
    cgs 14
    asasd 10
    cgs 9
    cgk 8
    cgs 11
    cgs 16
    cgs 17
    基于这个测试用例,你期望的结果是什么?写出例子来,不要只用文字说明。 
    "我想把所有重复的id都查询出来,只保留最小的那个id," 这句话很难理解正确的,猜错了反而未必是你要的东西。
      

  2.   

    把id为 8,9,11,16,17的查询出来。就是把那些多余重复的id查询出来。
      

  3.   

    mysql> select * from t_cgk100 order by 1,2;
    +-------+----+
    | name  | id |
    +-------+----+
    | asasd | 10 |
    | cgk   |  8 |
    | cgk   | 15 |
    | cgs   |  9 |
    | cgs   | 11 |

    | cgs   | 14 |
    | cgs   | 16 |
    | cgs   | 17 |

    +-------+----+看不懂你是如何选的,能解释一下吗?
      

  4.   

    我就是想把字段name的多余重复的id查询出来。
      

  5.   

    楼主注意看一下 3楼按照你提供的例子,| cgk  |  8 | 
    | cgk  | 15 | 选中8可以说选出一个小的,或者留下最大的。
    | cgs  |  9 | 
    | cgs  | 11 | 

    | cgs  | 14 | 
    | cgs  | 16 | 
    | cgs  | 17 | 
    这个为什么选中 9,11,16,17 ? 根据什么原则? 我猜了半天还没猜出来。 猜错了是浪费双方时间,估计你又得无满意结贴。
      

  6.   

    +-------+----+
    | name  | id |
    +-------+----+
    | asasd | 10 |
    | cgk  |  8 |
    | cgk  | 15 |
    | cgs  |  9 |
    | cgs  | 11 |
    | cgs  | 14 |
    | cgs  | 16 |
    | cgs  | 17 |
    +-------+----+ id这个字段是主键,自动递增的,但是name中有很多重复的记录,我想把多余重复的去掉,剩下的name都是唯一的,保留最小的id。
    查询的结果应该是。
    +-------+----+
    | name  | id |
    +-------+----+
    | asasd | 10 |
    | cgk  |  8 |
    | cgs  |  9 |
    +-------+----+
      

  7.   

    楼主如果的提问都是如此,你觉得别人能答出来吗?
    mysql> select * from t_cgk100;
    +-------+----+
    | name  | id |
    +-------+----+
    | cgk   |  8 |
    | cgs   |  9 |
    | asasd | 10 |
    | cgs   | 11 |
    | cgs   | 14 |
    | cgk   | 15 |
    | cgs   | 16 |
    | cgs   | 17 |
    +-------+----+
    8 rows in set (0.00 sec)mysql> select name,min(id) from t_cgk100 group by name;
    +-------+---------+
    | name  | min(id) |
    +-------+---------+
    | asasd |      10 |
    | cgk   |       8 |
    | cgs   |       9 |
    +-------+---------+
    3 rows in set (0.00 sec)或者 (估计你是想要这个,你的表中估计还有其它字段,全靠猜的)mysql> select * from t_cgk100 a
        -> where not exists (select 1 from t_cgk100 where name=a.name and id<a.id);
    +-------+----+
    | name  | id |
    +-------+----+
    | cgk   |  8 |
    | cgs   |  9 |
    | asasd | 10 |
    +-------+----+
    3 rows in set (0.00 sec)
      

  8.   

    select *, count(distinct name) from table group by name
    你的第二个快还是我这样写的速度快呢
      

  9.   

    你现在的问题和你一楼的已经相差十万八千里了。哪个速度快,要看你的索引。具体你可以自己测试一下。实践是检查的最好标准。如果有(name,id) 上的索引的话 ,则 select name , min(id) 比较快。