MYSQL数据库
有一分类数据表,有M个分类的数据(分类数和分类所属的数据数不定),实现:提取第一个分类N条数据,提取第二个分类N条数据……提取第M个分类N条数据;
提取第一个分类N条数据,提取第二个分类N条数据……提取第M个分类N条数据;
提取第一个分类N条数据,提取第二个分类N条数据……提取第M个分类N条数据;
…………
直到将所有数据提取后,写入另一个表中。可能我说得有些不大清楚,举个现实的例子,和分类列表页差不多,A分类下有B、C、D等若干个二级分类,显示A分类列表页时,需先显示B分类3条数据,C分类3条数据,D分类3条数据,接着是B分类的下3条数据,C分类的下3条数据,D分类的下3条数据…………就这样继续下去。
求教各位,用MYSQL -SQL语句应该如何实现呢?谢谢。

解决方案 »

  1.   

    select * from 有一分类数据表 a 
    where 分类='A'
    and 3>(select count(*) from 有一分类数据表 where 二级分类=a.二级分类 and ID>a.ID)
      

  2.   

    参考下贴中的多种方法http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
    [征集]分组取最大N条记录方法征集,及散分....
      

  3.   

    gijquery (gijquery)
      '截至2011-06-15 01:21:11  用户结帖率0.00% 当您的问题得到解答后请及时结贴.
    http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
    http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
    http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html8、如何给分和结贴?
    http://community.csdn.net/Help/HelpCenter.htm#结帖
      

  4.   

    贴建表及插入记录的SQL,及要求结果出来看看
      

  5.   


    感谢ACMAIN_CHM的提醒,问完结贴万岁!根据以上方法试了下,测试表中的总记录数3千多,二级分类数是8个(只是测试环境,实际应用环境数据量和二级分类数要更多些),查询时间用了11.828s,效率很低。且这个查询的只是提取了二级分类前3条的数据,没有继续向下递归,可以用循环方式,不过哪样速度将更慢了!请教有没有提效的更好方法呀?十分感谢各位的帮助!
      

  6.   

    如果这样,则不建议用SQL语句来实现这个功能。 用程序来实现反而高效。
     rs = select * from 有一分类数据表 where 分类='A'
     while not rs.eof
        rs2 = select * from 有一分类数据表 where 分类=rs(二级分类) limit 3
      

  7.   


    感谢你的提醒,拿出数据将更直观,谢谢!
    ## 建表:id是唯一的
    CREATE TABLE `cx_test` (
      `id` bigint(20) NOT NULL,
      `cate1` varchar(100) DEFAULT NULL,
      `cate2` varchar(100) DEFAULT NULL,
      `g_title` varchar(255) DEFAULT NULL
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;## 插入测试数据:
    INSERT INTO `cx_test` VALUES (1, 'X', 'AAA1', '测试AAA1001');
    INSERT INTO `cx_test` VALUES (2, 'X', 'AAA1', '测试AAA1002');
    INSERT INTO `cx_test` VALUES (3, 'X', 'AAA1', '测试AAA1003');
    INSERT INTO `cx_test` VALUES (4, 'X', 'AAA1', '测试AAA1004');
    INSERT INTO `cx_test` VALUES (5, 'X', 'AAA1', '测试AAA1005');
    INSERT INTO `cx_test` VALUES (6, 'X', 'AAA1', '测试AAA1006');
    INSERT INTO `cx_test` VALUES (7, 'X', 'AAA1', '测试AAA1007');
    INSERT INTO `cx_test` VALUES (8, 'X', 'AAA1', '测试AAA1008');
    INSERT INTO `cx_test` VALUES (9, 'X', 'AAA1', '测试AAA1009');
    INSERT INTO `cx_test` VALUES (10, 'X', 'AAA1', '测试AAA10010');
    INSERT INTO `cx_test` VALUES (11, 'X', 'AAA1', '测试AAA10011');
    INSERT INTO `cx_test` VALUES (12, 'X', 'AAA1', '测试AAA10012');INSERT INTO `cx_test` VALUES (13, 'X', 'AAA2', '测试AAA2001');
    INSERT INTO `cx_test` VALUES (14, 'X', 'AAA2', '测试AAA2002');
    INSERT INTO `cx_test` VALUES (15, 'X', 'AAA2', '测试AAA2003');
    INSERT INTO `cx_test` VALUES (16, 'X', 'AAA2', '测试AAA2004');
    INSERT INTO `cx_test` VALUES (17, 'X', 'AAA2', '测试AAA2005');
    INSERT INTO `cx_test` VALUES (18, 'X', 'AAA2', '测试AAA2006');
    INSERT INTO `cx_test` VALUES (19, 'X', 'AAA2', '测试AAA2007');
    INSERT INTO `cx_test` VALUES (20, 'X', 'AAA2', '测试AAA2008');
    INSERT INTO `cx_test` VALUES (21, 'X', 'AAA2', '测试AAA2009');
    INSERT INTO `cx_test` VALUES (22, 'X', 'AAA2', '测试AAA20010');
    INSERT INTO `cx_test` VALUES (23, 'X', 'AAA2', '测试AAA20011');INSERT INTO `cx_test` VALUES (24, 'X', 'AAA3', '测试AAA3001');
    INSERT INTO `cx_test` VALUES (25, 'X', 'AAA3', '测试AAA3002');
    INSERT INTO `cx_test` VALUES (26, 'X', 'AAA3', '测试AAA3003');
    INSERT INTO `cx_test` VALUES (27, 'X', 'AAA3', '测试AAA3004');
    INSERT INTO `cx_test` VALUES (28, 'X', 'AAA3', '测试AAA3005');
    INSERT INTO `cx_test` VALUES (29, 'X', 'AAA3', '测试AAA3006');
    INSERT INTO `cx_test` VALUES (30, 'X', 'AAA3', '测试AAA3007');
    INSERT INTO `cx_test` VALUES (31, 'X', 'AAA3', '测试AAA3008');
    INSERT INTO `cx_test` VALUES (32, 'X', 'AAA3', '测试AAA3009');
    INSERT INTO `cx_test` VALUES (33, 'X', 'AAA3', '测试AAA30010');
    INSERT INTO `cx_test` VALUES (34, 'X', 'AAA3', '测试AAA30011');
    INSERT INTO `cx_test` VALUES (35, 'X', 'AAA3', '测试AAA30012');
    INSERT INTO `cx_test` VALUES (36, 'X', 'AAA3', '测试AAA30013');
    INSERT INTO `cx_test` VALUES (37, 'X', 'AAA3', '测试AAA30014');
    根据贴注意涵义和以上插入的测试数据,需得到的写入另一个表的查询结果如下:
    (----线是为了各位查看方便加上的,无意义)1 X AAA1 测试AAA1001
    2 X AAA1 测试AAA1002
    3 X AAA1 测试AAA100313 X AAA2 测试AAA2001
    14 X AAA2 测试AAA2002
    15 X AAA2 测试AAA200324 X AAA3 测试AAA3001
    25 X AAA3 测试AAA3002
    26 X AAA3 测试AAA3003
    ------------------------------------
    4 X AAA1 测试AAA1004
    5 X AAA1 测试AAA1005
    6 X AAA1 测试AAA100616 X AAA2 测试AAA2004
    17 X AAA2 测试AAA2005
    18 X AAA2 测试AAA200627 X AAA3 测试AAA3004
    28 X AAA3 测试AAA3005
    29 X AAA3 测试AAA3006
    ---------------------------------------
    7 X AAA1 测试AAA1007
    8 X AAA1 测试AAA1008
    9 X AAA1 测试AAA100919 X AAA2 测试AAA2007
    20 X AAA2 测试AAA2008
    21 X AAA2 测试AAA200930 X AAA3 测试AAA3007
    31 X AAA3 测试AAA3008
    32 X AAA3 测试AAA3009
    ------------------------------------------
    10 X AAA1 测试AAA10010
    11 X AAA1 测试AAA10011
    12 X AAA1 测试AAA1001222 X AAA2 测试AAA20010
    23 X AAA2 测试AAA2001133 X AAA3 测试AAA30010
    34 X AAA3 测试AAA30011
    35 X AAA3 测试AAA30012
    ------------------------------------------
    36 X AAA3 测试AAA30013
    37 X AAA3 测试AAA30014
    ------------------------------------------
      

  8.   

    MYSQL不支持递归查询,用SP来解决,打开游标->循环取分类值->取N条数数据