有两个表,channel表,具有id,channelId,name字段.结构为树状.即
A(1,0,"A")
/ \
B(2,1,"B") C(3,1,"C")
/ \ \
D(4,2,"D") E(5,2,"E") F(6,3,"F)article表,具有id,channelId,title属性.channelId关联channel表中叶子结点的id,如上面D,E,F.要求使用mysql写存储过程,查出以下内容:
(1)查询出channel表指定ID的所有子channel.
(2)查询出channel表指定ID的所有叶子channel.
(3)查询出指定channelId的与所有叶子channel的ID关联的所有article.如指定ID为1,则查询出article表中所有channelId为4,5,6的article数据.最近在做一个CMS系统.我用JAVA可以遍历查询出来.但是我希望在数据库里用存储过程查询出来.
A(1,0,"A")
/ \
B(2,1,"B") C(3,1,"C")
/ \ \
D(4,2,"D") E(5,2,"E") F(6,3,"F)article表,具有id,channelId,title属性.channelId关联channel表中叶子结点的id,如上面D,E,F.要求使用mysql写存储过程,查出以下内容:
(1)查询出channel表指定ID的所有子channel.
(2)查询出channel表指定ID的所有叶子channel.
(3)查询出指定channelId的与所有叶子channel的ID关联的所有article.如指定ID为1,则查询出article表中所有channelId为4,5,6的article数据.最近在做一个CMS系统.我用JAVA可以遍历查询出来.但是我希望在数据库里用存储过程查询出来.
解决方案 »
- SQL时间格式为“1337686439”,如何转换成普通日期格式
- 求助:MYSQL数据库中表数据量很大时它删除不成功?哪位大侠遇到过?
- 如何删除数据后,让主键自动减少?
- [MySQL] 找不到要更新的资料行, 最后读取的值已被变更
- 请大哥大姐们帮帮我,求一个存储过程
- 问一下CHAR与VARCHAR的区别
- 请教如何编写shell脚本,实现在postgresql中建库和建表的操作(特急)
- mysql空间数据库怎样将一个字段的所有空间数据添加进GeometryCollection
- 请教一个c++操作mysql速度方面的问题
- mysql如何做到按行排序?
- 用mysql查询当前时间至6个月前的数据怎么查询?
- 老话重谈,PostgreSQL 和 MySQL 性能,稳定性对比。
字段:id name,left_node,right_node;
id, name, leftnode, rightnode, parent
+------------+--------------+--------------+
| ProdCateID | ProdCateName | ParentCateID |
+------------+--------------+--------------+
| 1 | 服装 | 0 |
| 2 | 箱包 | 0 |
| 3 | 内衣 | 1 |
| 4 | 外套 | 1 |
| 5 | 男箱包 | 2 |
| 6 | 女箱包 | 2 |
| 7 | 内裤 | 3 |
| 8 | 文胸 | 3 |
| 9 | 男外套 | 4 |
| 10 | 女大衣 | 4 |
| 11 | 男用钱包 | 5 |
| 12 | 女用钱包 | 6 |
+------------+--------------+--------------+
SP代码如下:
DELIMITER $$DROP PROCEDURE IF EXISTS `tennis`.`sp_tree_test` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_tree_test`(in parent_id int)
begin
declare level smallint default 0;
declare cnt int default 0;
create temporary table tt(ProdCateID int,ProdCateName varchar(20),
ParentCateID int,level smallint,sort varchar(1000));
create temporary table tt2(ProdCateID int,ProdCateName varchar(20),
ParentCateID int,level smallint,sort varchar(1000)); insert into tt select ProdCateID,ProdCateName,
ParentCateID,level,cast(ProdCateID as char)
from tb_test
where ParentCateID=parent_id; select row_count() into cnt;
insert into tt2 select * from tt; while cnt>0 do
set level=level+1;
truncate table tt;
insert into tt select a.ProdCateID,a.ProdCateName,
a.ParentCateID,level,concat(b.sort,a.ProdCateID)
from tb_test a,tt2 b
where a.ParentCateID=b.ProdCateID and b.level=level-1;
select row_count() into cnt;
insert into tt2 select * from tt;
end while;
select ProdCateID,
concat(space(a.level*2),'|--',a.ProdCateName) ProdCateName
from tt2 a
order by sort; drop table tt;
drop table tt2;
end $$DELIMITER ;##执行mysql> call sp_tree_test(0);
+------------+-----------------+
| ProdCateID | ProdCateName |
+------------+-----------------+
| 1 | |--服装 |
| 3 | |--内衣 |
| 7 | |--内裤 |
| 8 | |--文胸 |
| 4 | |--外套 |
| 10 | |--女大衣 |
| 9 | |--男外套 |
| 2 | |--箱包 |
| 5 | |--男箱包 |
| 11 | |--男用钱包 |
| 6 | |--女箱包 |
| 12 | |--女用钱包 |
+------------+-----------------+
12 rows in set (0.30 sec)
但是,我有一个问题要问您:
我也写了一个 但是我的列名是 带下划线的,如:class_id ,class_name , parent_id
查询出来的结果有问题,我把你写的这个过程建立了和你一样的表,查询的结果是正确的,我又建了一个表,只是字段名带有下划线,结果是错误的,我只是去掉了下划线,别的没有动,结果确是正确的,我很郁闷!我反复测试了很久不知道为什么?mysql 允许字段名 带下划线的呀!
请 liangCK 您帮忙解释一下!
也请各位高手指点一下
| 1 | |--服装 |
| 3 | |--内衣 |
| 7 | |--内裤 |
| 8 | |--文胸 |
| 4 | |--外套 |
| 10 | |--女大衣 |
| 9 | |--男外套 |
| 2 | |--箱包 |
| 5 | |--男箱包 |
| 11 | |--男用钱包 |
| 6 | |--女箱包 |
| 12 | |--女用钱包