首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化自连接表

优化自连接表
EN

Stack Overflow用户
提问于 2011-11-28 15:28:58
回答 1查看 353关注 0票数 1

我有一张桌子,是我自己做的.我的样本表是这样的

代码语言:javascript
复制
-- Table genealogy
+--------+---------+------+-----+---------+-------+
| Field  | Type    | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| parent | int(11) | NO   | PRI | NULL    |       |
| child  | int(11) | NO   | PRI | NULL    |       |
+--------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)

这个概念是这样的(做好准备):

为了找到用户的孩子,我看用户的第一层,寻找用户的外孙,寻找用户的孙子,寻找用户的子代,找出第三层的子代,寻找parent=1.

  • ...and的孙子,等等,我寻找的是parent=1.

  • ...and的孩子,等等。

它可能会有点混乱,但我的查询工作得很好。我想知道是否有一种更快/更优化的方法,因为我只是在各地重复我的sql。

代码语言:javascript
复制
-- Get Child
SELECT parent, child AS '1st Level' FROM genealogy WHERE parent=1;

-- Get Grandchild
SELECT a.parent, b.child AS '2nd Level' FROM (SELECT * FROM genealogy WHERE parent=1) a INNER JOIN genealogy b ON a.child=b.parent;

-- Get Great-Grandchild
SELECT a.parent, b.child AS '3rd Level' FROM (SELECT a.parent, b.child FROM (SELECT * FROM genealogy WHERE parent=1) a INNER JOIN genealogy b ON a.child=b.parent) a INNER JOIN genealogy b ON a.child=b.parent;

-- And the list goes on
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-28 15:42:20

您可以使用另一个树结构(称为嵌套集):

代码语言:javascript
复制
-- Table genealogy
+--------+---------+------+-----+---------+-------+
| Field  | Type    | Null | Key | Default | Extra |
+--------+---------+------+-----+---------+-------+
| id     | int(11) | NO   | PRI | NULL    |       |
| lft    | int(11) | NO   | NO  | NULL    |       |
| rgt    | int(11) | NO   | NO  | NULL    |       |
+--------+---------+------+-----+---------+-------+

这将使您能够选择树内一个节点的所有子程序(以及大子节点和大子节点等等)。

例如,要选择所有家谱id 1的子代:

代码语言:javascript
复制
SELECT g2.*
FROM genealogy AS g1, genealogy AS g2
WHERE 
  (g1.lft BETWEEN g2.lft AND g2.rgt)
AND 
  (g1.id = 1);

有关更多信息和更多示例,您可能会查看以下内容:http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8298131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档