比如一个表
chapterid chapter
   1    a
   1    b
   1    c
   2    d
   2    e
   3    f
   1    g
   2    h
   2    i
   1    gchapterid字段 1 重复了5次 
     2重复了4次
     3出现了1次
我现在想让重复超过3次的 显示3次 没超过的就全部显示
比如显示成
chapterid chapter
   1    a
   1    b
   1    c
   2    d
   2    e
   2    h
   3    f
这个查询sql语句 怎么写  我是mysql数据库 所以top好像是不能用的吧 mysql里可以用limit来限制显示条数

解决方案 »

  1.   

    估计mysql 是达不到这个要求.
    用过程或者php脚本配合吧.
      

  2.   

    存储过程不太清楚,不过用php实现不难.
    <?php
         conect();
         select_db();
         $result=mysql_query("select distinct(chapterid) from table_name");
         $is_first=true;
         while($row=mysql_fetch_array($result)){
              if($is_first)
                     $sql="select * from table_name where chapterid=$row['chapterid'] limit 3";
              else
                     $sql.="union select * from table_name where chapterid=$row['chapterid'] limit 3";
              $is_fist=false;
         }
         $result=mysql_query("$sql");
    ?>
    不过表太大的话,查询语句可能过长.那就要另想办法了.
      

  3.   

    select * from table a inner join (select chapterid from table group by chapterid having count(*) <= 3) b
    on a.chapterid = b.chapterid
      

  4.   

    增加辅助列ID
    SELECT A.chapter,A.chapterid FROM TRY1 A LEFT JOIN
    TRY1 B ON A.chapterid=B.chapterid AND A.ID>=B.ID
    GROUP BY A.chapter,A.chapterid HAVING COUNT(*)<=3 ORDER BY A.chapterid,COUNT(*)
      

  5.   

    是不是我上面那个表偏的太厉害 大家看不清
    我重新写下吧
    表T含2个字段 chapterid 和 chapter 
    chapterid chapter 
      1         a 
      1         b 
      1         c 
      2         d 
      2         e 
      3         f 
      1         g 
      2         h 
      2         i 
      1         g 要显示成 
    chapterid chapter 
      1         a 
      1         b 
      1         c 
      2         d 
      2         e 
      2         h 
      3         f 
      

  6.   

    又偏了
    字母是chapter字段下面的
      

  7.   

    可以说一下辅助列的作用吗 
    这个辅助列ID的内容要填什么啊从HAVING COUNT(*) <=3 来看 好像将显示出来的也是chapterid重复少于3次的记录啊
      

  8.   

    搞定了 WWWWA 谢谢拉
    再请教一下 这样内联对一个近1百万的表频繁查询是不是太耗费资源了?
    还有一个重要的问题 要怎么让那显示出来的3条记录不是固定的,比如总共有5条,我想让他随机的显示出3条
    mysql能实现吗
      

  9.   

    搞定了 WWWWA 谢谢拉
    再请教一下 这样内联对一个近1百万的表频繁查询是不是太耗费资源了?
    还有一个重要的问题 要怎么让那显示出来的3条记录不是固定的,比如总共有5条,我想让他随机的显示出3条
    mysql能实现吗
      

  10.   

    WWWWA wwwb 你们是同一个人吧 分给谁都可以吧
      

  11.   

    搞定了 WWWWA 谢谢拉
    再请教一下 这样内联对一个近1百万的表频繁查询是不是太耗费资源了?在chapterid、ID上建立索引,速度要好一点,在网络止是有点耗费资源还有一个重要的问题 要怎么让那显示出来的3条记录不是固定的,比如总共有5条,我想让他随机的显示出3条
    mysql能实现吗这种要求只有用存储过程了
      

  12.   


    EN 我多加个条件就可以了
    问下 在
    SELECT * FROM test A LEFT JOIN 
    test B ON A.chaptername=B.chaptername AND A.id>=B.id
    后面
    加 and A.bookid=250 好
    还是 where A.bookid=250哪个效率更高?
      

  13.   


    就是把那个ID字段的值随机生成?
    那就是再select之前要写个更新语句把ID字段的值全部更新一遍还是……
      

  14.   

    就是把那个ID字段的值随机生成? YES
    全部更新一遍
      

  15.   


    是用个循环吧这样全部更新一遍再显示出来岂不是很慢你看这个页面
    http://www.sodu.com.cn/mulu_2564.html
    他的前5,6条记录是随机出现的 你觉得他是这样实现的吗
      

  16.   

    能不能 在 group by 里面排序 就是那个显示3条记录的一个小集团里排序 
    刚看到随机数可以用来排序ORDER BY RAND();
      

  17.   

    用rand()函数,也可以不用替换,用子查询,不过数据量大的话,速度较慢
      

  18.   

    搞定了 呵呵 不用更新ID了 先用chapterid排序在用RAND()就可以了
    再次感谢!!
      

  19.   

    SELECT A.chapterid,A.chapter FROM TRY1 A LEFT JOIN 
    TRY1 B ON A.chapterid=B.chapterid AND A.ID>=B.ID and A.bookid=1
    GROUP BY A.chapter,A.chapterid HAVING COUNT(*) <=3 ORDER BY A.chapterid,RAND()  
      

  20.   

    呵呵 将写好的语句用实际数据测试了一下 14W的数据
    SELECT * FROM test A LEFT JOIN 
    test B ON A.chaptername=B.chaptername AND A.id>=B.id AND A.bookid=250
    GROUP BY A.chaptername,A.chapterurl HAVING COUNT(*) <=5 
    ORDER BY A.updatetime desc,RAND() limit 20执行了1个小时32分钟也没执行完 等不下去了,终止优化了一下,把要进行内联的表缩小(即用一个子查询代替)
    SELECT * FROM (select * from test where bookid=250) A LEFT JOIN 
    (select * from test where bookid=250) B ON A.chaptername=B.chaptername AND A.id>=B.id
    GROUP BY A.chaptername,A.chapterurl HAVING COUNT(*) <=5 
    ORDER BY A.chaptername,RAND() limit 20执行3秒,呜呜 快好多啊 再弄个索引 300多毫秒
    呵呵 速度和带索引的 SELECT * FROM test where bookid=250 order by updatetime desc limit 20 差不多