MySQL-mysql如何查询某个id的所有pid

发布于 2017-01-14 06:55:47 字数 654 浏览 1320 评论 2

数据库表结构如下:

+----+----------+------+
| id | nodename | pid |
+----+----------+------+
| 1 | A | 0 |
| 2 | B | 1 |
| 3 | C | 1 |
| 4 | D | 2 |
| 5 | E | 2 |
| 6 | F | 3 |
| 7 | G | 6 |
| 8 | H | 0 |
| 9 | I | 8 |
| 10 | J | 8 |
| 11 | K | 8 |
| 12 | L | 9 |
| 13 | M | 9 |
| 14 | N | 12 |
| 15 | O | 12 |
| 16 | P | 15 |
| 17 | Q | 15 |
+----+----------+------+

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

泛泛之交 2017-06-23 09:46:36

居然被人举报了,这算是答非所问么。

采用id和pid的方式,没办法优化查询,因为你储存的单一关系,要获得所有父类,必须通过多次查询来实现,或者在你知道父类层数的情况下,不断的join。

对于无限分类来说一般有以下几种实现方式
1,id 和 pid

这种实现方式对于只查询父类,和根据父类查询一层子类来说,性能是最好的,但是如果查询所有分类,必须依赖递归或者在mysql里不断join来实现。

2,id 和 path

path里面储存所有的父id列表,比如
id = 7, path = 0-1-3-6
这种实现方式是通过concat来计算,缺点是如果实现单纯查父类或者查该类下面的子类,必须要进行字符串的处理,但是对于显示完整分类的效率很高,查询所有父类效率也很高。

所以建议的方式是 id,pid和path同时保留

3,BTree 方式 leftid和rightid

这个是通过数学方式来计算可以实现,查询效率很高,但查询分类的时候需要遍历相应的记录,比path的方式性能略低。在更新分类关系的时候,需要遍历所有记录,但一般update的频率很低,所以可以忽略不计。

4,bitset 方式

通过二进制来表现分类之间的关系,优点是在记录分类关系上比较节约资源,缺点是也需要一个解析过程。

夜无邪 2017-04-22 01:32:00

SELECT T2.id,T2.nodename
FROM (
SELECT
@r AS _id,
(SELECT @r := pid FROM tablename WHERE id = _id) AS pid,
@l := @l + 1 AS lvl
FROM
(SELECT @r := 5, @l := 0) vars,
tablename h
WHERE @r <> 0) T1
JOIN tablename T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC

 @r := 5是你需要传进来的id

再者发现一个不错的文章:

managing-hierarchical-data-in-mysql

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文