关于提取二级分类下N条数据的问题(整了三天了,没整出来,不行了,向大伙求教)

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语句应该如何实现呢?谢谢。

作者: gijquery   发布时间: 2011-06-15

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

作者: ACMAIN_CHM   发布时间: 2011-06-15

参考下贴中的多种方法

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

作者: ACMAIN_CHM   发布时间: 2011-06-15

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.html

8、如何给分和结贴?
http://community.csdn.net/Help/HelpCenter.htm#结帖


作者: ACMAIN_CHM   发布时间: 2011-06-15

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

作者: wwwwb   发布时间: 2011-06-15

引用 1 楼 acmain_chm 的回复:

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


感谢ACMAIN_CHM的提醒,问完结贴万岁!

根据以上方法试了下,测试表中的总记录数3千多,二级分类数是8个(只是测试环境,实际应用环境数据量和二级分类数要更多些),查询时间用了11.828s,效率很低。且这个查询的只是提取了二级分类前3条的数据,没有继续向下递归,可以用循环方式,不过哪样速度将更慢了!

请教有没有提效的更好方法呀?十分感谢各位的帮助!

作者: gijquery   发布时间: 2011-06-15

引用 5 楼 gijquery 的回复:
引用 1 楼 acmain_chm 的回复:

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


感谢ACMAIN_CHM的提醒,问完结贴万岁!

根据以上方法试了下,测试表中的总记录数3千多,二级分……
如果这样,则不建议用SQL语句来实现这个功能。 用程序来实现反而高效。


 rs = select * from 有一分类数据表 where 分类='A'
 while not rs.eof
  rs2 = select * from 有一分类数据表 where 分类=rs(二级分类) limit 3

作者: ACMAIN_CHM   发布时间: 2011-06-15

引用 4 楼 wwwwb 的回复:

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


感谢你的提醒,拿出数据将更直观,谢谢!

SQL code

## 建表: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 测试AAA1003

13 X AAA2 测试AAA2001
14 X AAA2 测试AAA2002
15 X AAA2 测试AAA2003

24 X AAA3 测试AAA3001
25 X AAA3 测试AAA3002
26 X AAA3 测试AAA3003
------------------------------------
4 X AAA1 测试AAA1004
5 X AAA1 测试AAA1005
6 X AAA1 测试AAA1006

16 X AAA2 测试AAA2004
17 X AAA2 测试AAA2005
18 X AAA2 测试AAA2006

27 X AAA3 测试AAA3004
28 X AAA3 测试AAA3005
29 X AAA3 测试AAA3006
---------------------------------------
7 X AAA1 测试AAA1007
8 X AAA1 测试AAA1008
9 X AAA1 测试AAA1009

19 X AAA2 测试AAA2007
20 X AAA2 测试AAA2008
21 X AAA2 测试AAA2009

30 X AAA3 测试AAA3007
31 X AAA3 测试AAA3008
32 X AAA3 测试AAA3009
------------------------------------------
10 X AAA1 测试AAA10010
11 X AAA1 测试AAA10011
12 X AAA1 测试AAA10012

22 X AAA2 测试AAA20010
23 X AAA2 测试AAA20011

33 X AAA3 测试AAA30010
34 X AAA3 测试AAA30011
35 X AAA3 测试AAA30012
------------------------------------------
36 X AAA3 测试AAA30013
37 X AAA3 测试AAA30014
------------------------------------------

作者: gijquery   发布时间: 2011-06-15

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

作者: WWWWA   发布时间: 2011-06-15