PHP如何在读取数据后用URL中取得id值来识别下级记录是否有孙级记录

彭哥 发布于 2012/06/30 10:39
阅读 908
收藏 0
PHP

从地址栏中获取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显示为文件夹的图标。

加载中
0
红薯
红薯

既然是菜单的数据,我想数量不会太大吧?

你一次性通过 select id,pid,pname from table 查询出所有的数据,然后在内存中构建一颗树,现在要判断节点就很简单的,对数据库压力也非常的小

彭哥
彭哥
这回不仅仅是菜单了,而且包含里面主要数据了,最后要求就把有次级记录的数据排在前面并在记录图标显示为目录图标!没有就用文章图标!
0
Teo
Teo
这个方法以前让我想了好几天。。。。。将数组主ID分离或者循环寻下级。。。都在内存中执行,可以无限寻下级(有点消耗)。。网络上有一段别人写好的代码段,属于将数组分离再寻找的。。反之亦然,将思路反转也可以递归。。
彭哥
彭哥
回复 @Teo : 要的,主要是为了子级记录按有无孙级记录的多少来排序!并且决定其左边图标是用什么!
Teo
Teo
回复 @彭哥 : 获得了主从关系的数组,还需要分页?作用是??
彭哥
彭哥
回复 @Teo : 分页呢?关键因素之一啊!如何得到孙级别记录呢? 其实只要判断子记录有没有孙级记录,并非要显示孙记录
Teo
Teo
先读取id,pid段,然后处理下级关系,组成树状结果,最后按顺序获取其它字段。这个方法也行
彭哥
彭哥
请问分离的依据是什么?就是ID号吗?还有到最后怎么合成在一起来执行呢?并且要考虑到分页等等状况发生的哦!
0
飞晏
飞晏

我就知道怎么去取数据

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)

mysql> SELECT id,pid,pname FROM test WHERE id IN ( SELECT pid FROM test WHERE id NOT IN (SELECT DISTINCT pid FROM test) );
+----+------+------------------+
| id | pid  | pname            |
+----+------+------------------+
|  1 |    0 | 第一级分类1      |
|  2 |    0 | 第一级分类2      |
|  3 |    0 | 第一级分类3      |
|  4 |    1 | 第二级分类1      |
|  5 |    1 | 第二级分类2      |
|  8 |    2 | 第二级分类5      |
|  9 |    3 | 第二级分类6      |
+----+------+------------------+
7 rows in set (0.00 sec)

飞晏
飞晏
回复 @彭哥 : 对,尤其是第二条SQL,用了两次IN操作和临时表,在数据量很大的情况下会很消耗性能。我觉得最好的方法还是一次性把数据读出来的好,数据库的处理能力肯定不如开发语言。
彭哥
彭哥
恩,你的思路是可行的,这点我以前我讨论过,有一点就是太耗数据库性能了,我想要最佳思路就是读一次数据库资料出来然后用数组处理!这样应该效果会好些!
0
彭哥
彭哥
大家别弄错了,其实是不要获id=15的孙子记录,只要判断id=15记录的儿子有无其孙子记录即可,并非要显示!这才是关键点之一
0
泡不烂的凉粉
泡不烂的凉粉

你是真的不会,还是哗众取宠。 你用了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 , 就说明对应的分类已经没有子类。

另外,你不是也说了。 数据量不大情况下,一次数据库操作获取数据,程序递归读取数据么。
如果分类没有子类,那就读取不到子类了。自然知道要读取的分类属于最底层了。何必又有这个问题呢。

看了之前你关于分类的问题。 似乎很多人都给了你思路以及推荐阅读。
难道你只是来求代码的。 自己并没吃透内容? 你是求鱼还是求渔?

彭哥
彭哥
没明白,你给一个例子看看,我就会明白点。 说白了,我水平有限,呵呵,我是为了渔到鱼而求渔和鱼!
彭哥
彭哥
是在一个表里啊,不是多个表,数据库表结构上面有提示!谢谢!
返回顶部
顶部