首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL选择父母和祖父母

MySQL选择父母和祖父母
EN

Stack Overflow用户
提问于 2013-09-24 02:02:24
回答 1查看 824关注 0票数 0

我试图在形容词列表中选择“父”和“祖父母”节点,但是不知道如何通过select查询(im初学者mysql程序员)来构建。

我试图建立一个订单系统,每个分销商可以看到他们在一个月内赚了多少钱。我从客户那里得到订单,客户经销商从订单中获得佣金,而分销商“父”分销商也得到少量佣金。

我的表是这样的(刚刚写了重要的列):

代码语言:javascript
复制
Table: order
-----------------------------
order_id | customer_id
-----------------------------
1        |  1007
2        |  1004
3        |  1001
4        |  1005
5        |  1009


Table: customers
------------------------------
customer_id | distributor_id   <-- distributor_id is just like parent_id
------------------------------     (customers can also be distributors)
1001    | 0
1002    | 0
1003    | 0
1004    | 1001
1005    | 1004
1006    | 1002
1007    | 1001
1008    | 1005
1009    | 1004

对于order_id 5,customer 1009,(父)分发服务器是1004。1004的(祖父母)分销商是1001。distributor_id值为0只意味着没有父分发服务器。

我想做的是在一页上显示1001获得佣金的所有订单(客户的父母和祖父母)。我只能选择父母,当爷爷奶奶在深水里游泳的时候,帮我!)

编辑:我可能已经用这个解决了它(不知道它是否讨厌):

代码语言:javascript
复制
SELECT c.*, o.*
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
LEFT JOIN customers p ON p.customer_id = c.distributor_id
WHERE c.distributor_id = 1001 OR p.distributor_id = 1001
EN

回答 1

Stack Overflow用户

发布于 2013-09-24 02:22:29

简单的答案是,您需要执行几个查询,每个级别一个查询,因为您遵循父ids。当你失去父母的时候你就会停下来。

这种针对层次结构的设计是逻辑的、显而易见的,通常不适合于关系数据库。问题是,您根本无法执行一个SQL查询来获取记录和它的所有父级。为了得到一张唱片和它的父母,你可以做一个自我连接,做第三个层次,你可以做第二个自我连接,但是你怎么一直坚持到你的父母都没有了?您不能这样做,SQL没有这样的动态连接机制。因此,这个结构的解决方案是进行多个查询。对于非常小的树木,没有一个巨大的性能损失。

如果您想重新设计您的表,以便您可以使用单个查询进行操作,则需要使用名为嵌套集的结构。

(编辑:实际上,我刚刚发现了一个名为“公共表表达式”的SQL扩展,它是为分层数据设计的。不幸的是,MySQL不支持它。)

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

https://stackoverflow.com/questions/18971823

复制
相关文章

相似问题

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