MySQL-mysql如何查询某个id的所有pid
数据库表结构如下:
+----+----------+------+
| 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
居然被人举报了,这算是答非所问么。
采用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 方式
通过二进制来表现分类之间的关系,优点是在记录分类关系上比较节约资源,缺点是也需要一个解析过程。
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