假设表中有两个字段 id ,name,id 是主键
如何查询出name重复的所有行呢
例如
id,    name
1      aa
2      bb
3      aa
4      cc
5      bb
6      dd需要返回1    aa
3    aa
2    bb
5    bb
===========================
方法之一是:
select a.id,a.name from tty1 a
left join tty1 b on a.name=b.name group by a.id,a.name
having count(b.id)>=2 order by a.name请帮我分解一下这个语句吧,最好用括号来把一部分一部分隔离出来,或者第一步先分解出什么来,第二步分解出什么来
这里,group by 是不是与having count相互配合的?
group by a.id, a.name是a left join b时用的,还是select ... from table时用的?
having count(b.id)是a left join b时用的,还是select ... from talbe时用的?
order by a.name呢?
谢谢

解决方案 »

  1.   


    这里,group by 是不是与having count相互配合的? 
    是group by a.id, a.name是a left join b时用的,还是select ... from table时用的? 
    是select ... from table时用的having count(b.id)是a left join b时用的,还是select ... from talbe时用的? 
    是 left join b时用的select a.id,a.name from tty1 a
    left join tty1 b on a.name=b.name 
    看看结果,另:是我的代码吧?
      

  2.   

    select a.id,a.name from tty1 a
    left join tty1 b on a.name=b.name 这是一个自连接查询,连接条件是NAME相同,如NAME相同的记录数大于2,则满足条件
      

  3.   

    把你的语句重新排版一下就可以看清楚了。select a.id,a.name 
    from tty1 a left join tty1 b on a.name=b.name 
    group by a.id,a.name
    having count(b.id)>=2 
    order by a.name
    http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#select
    13.2.7. SELECT语法如果您使用GROUP BY,则输出行根据GROUP BY列进行分类
    SQL标准要求HAVING必须引用GROUP BY子句中的列或用于总计函数中的列。不过,MySQL支持对此工作性质的扩展,并允许HAVING因为SELECT清单中的列和外部子查询中的列。
    
      

  4.   

    呵呵,就是WWWWA的代码想了半天,在机器上试验了一下,总算差不多明白了select a.id,a.name 
    from tty1 a left join tty1 b on a.name=b.name 
    group by a.id,a.name
    having count(b.id)>=2 
    order by a.name
    这里,生成了一个临时的表,tty1 a left join tty1 b on a.name=b.name,然后围绕这个临时的表进行select。而group by, having count, order by 都是在select操作基础上的,不知道理解得对不对?