从地址栏中获取id值为15,
SQL:select id,pid,pname from table where id=15
pid是归属ID
即id值 为1,那么pid值为0则意味着,这个记录为顶级菜单,
若id为15,pid为8,15号ID则这条记录是8号ID儿子级,依理推,若id=32,pid=15则表示32号记录为15号的儿子级记录,依理再推一,id=48,pid=32则48号id这条记录就是id值15的孙子级记录。
如何用数组或SQL数据形式,表示出下面几点:
1.若无子记录,则正常显示其内容
2.若有子记录,且所有子记录没有次级目录,即其没孙子级记录;在记录前ico显为文章图标;
3.若有子记录,部分子记录有次级目录,即有孙子级记录,则有次级记录的子记录,在记录前ico显示为文件夹的图标。
既然是菜单的数据,我想数量不会太大吧?
你一次性通过 select id,pid,pname from table 查询出所有的数据,然后在内存中构建一颗树,现在要判断节点就很简单的,对数据库压力也非常的小
######这回不仅仅是菜单了,而且包含里面主要数据了,最后要求就把有次级记录的数据排在前面并在记录图标显示为目录图标!没有就用文章图标!######这个方法以前让我想了好几天。。。。。将数组主ID分离或者循环寻下级。。。都在内存中执行,可以无限寻下级(有点消耗)。。网络上有一段别人写好的代码段,属于将数组分离再寻找的。。反之亦然,将思路反转也可以递归。。######回复 @Teo : 要的,主要是为了子级记录按有无孙级记录的多少来排序!并且决定其左边图标是用什么!######回复 @彭哥 : 获得了主从关系的数组,还需要分页?作用是??######回复 @Teo : 分页呢?关键因素之一啊!如何得到孙级别记录呢? 其实只要判断子记录有没有孙级记录,并非要显示孙记录######先读取id,pid段,然后处理下级关系,组成树状结果,最后按顺序获取其它字段。这个方法也行######请问分离的依据是什么?就是ID号吗?还有到最后怎么合成在一起来执行呢?并且要考虑到分页等等状况发生的哦!######我就知道怎么去取数据
1. 第1个,查询id不在PID中的就是最底层的记录
SELECT id,pid,pname FROM table WHERE id NOT IN (SELECT DISTINCT pid FROM table)
2. 第2个,查询第1个中的PID即可
SELECT id,pid,pname FROM table WHERE id IN ( SELECT pid,pname FROM table WHERE id NOT IN (SELECT DISTINCT pid FROM table) )
3. 程序里面递归处理吧
测试下:
mysql> SELECT *FROM test;
+----+------+------------------+
| id | pid | pname |
+----+------+------------------+
| 1 | 0 | 第一级分类1 |
| 2 | 0 | 第一级分类2 |
| 3 | 0 | 第一级分类3 |
| 4 | 1 | 第二级分类1 |
| 5 | 1 | 第二级分类2 |
| 6 | 1 | 第二级分类3 |
| 7 | 2 | 第二级分类4 |
| 8 | 2 | 第二级分类5 |
| 9 | 3 | 第二级分类6 |
| 10 | 3 | 第二级分类7 |
| 11 | 3 | 第二级分类8 |
| 12 | 3 | 第二级分类9 |
| 13 | 4 | 最底层分类1 |
| 14 | 4 | 最底层分类2 |
| 15 | 5 | 最底层分类3 |
| 16 | 8 | 最底层分类4 |
| 17 | 9 | 最底层分类5 |
| 18 | 5 | 最底层分类6 |
| 19 | 5 | 最底层分类7 |
| 20 | 5 | 最底层分类8 |
+----+------+------------------+
20 rows in set (0.00 sec)
mysql> SELECT id,pid,pname FROM test WHERE id NOT IN (SELECT DISTINCT pid FROM test);
+----+------+------------------+
| id | pid | pname |
+----+------+------------------+
| 6 | 1 | 第二级分类3 |
| 7 | 2 | 第二级分类4 |
| 10 | 3 | 第二级分类7 |
| 11 | 3 | 第二级分类8 |
| 12 | 3 | 第二级分类9 |
| 13 | 4 | 最底层分类1 |
| 14 | 4 | 最底层分类2 |
| 15 | 5 | 最底层分类3 |
| 16 | 8 | 最底层分类4 |
| 17 | 9 | 最底层分类5 |
| 18 | 5 | 最底层分类6 |
| 19 | 5 | 最底层分类7 |
| 20 | 5 | 最底层分类8 |
+----+------+------------------+
13 rows in set (0.00 sec)
你是真的不会,还是哗众取宠。 你用了3个月,依然不会举一反三?怀疑你真读用户手册了没有,不用问, 你使用的仍然是MYSQL. 我的耐心快被你磨平了。
如果你的需求是这样的:
叶面获取id, 需要从数据查询 对应信息的子分类信息,同时需要知道获取的记录是否有子分类。
SELECT A.* , COUNT(X.id) SUB_NUM FROM table A LEFT JOIN table X ON A.id=X.pid WHERE A.pid = 15 GROUP BY A.id ORDER BY SUB_NUM DESC # 以上是获取 父亲id=15 的分类,并根据获取分类信息的子分类的信息条目从多到少排序。 # 如果获取结果 SUB_NUM == 0 , 就说明对应的分类已经没有子类。
另外,你不是也说了。 数据量不大情况下,一次数据库操作获取数据,程序递归读取数据么。
如果分类没有子类,那就读取不到子类了。自然知道要读取的分类属于最底层了。何必又有这个问题呢。
看了之前你关于分类的问题。 似乎很多人都给了你思路以及推荐阅读。
难道你只是来求代码的。 自己并没吃透内容? 你是求鱼还是求渔?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。