MySQL选择父级和祖父级

时间:2013-09-24 02:02:24

标签: mysql

我试图在adjecency列表中选择“parent”和“grandparent”节点但是没有线索如何通过SELECT查询构建(im初学者mysql程序员)。

我试图建立一个订单系统,每个经销商可以看到他们在一个月内赚了多少钱。我收到客户的订单,客户经销商从该订单获得佣金,经销商“母公司”经销商也获得了一笔小额佣金。

我的表就是这样(只写了重要的专栏):

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,客户1009,(父)经销商是1004.1004的(祖父母)经销商是1001.extributor_id为0只表示没有父经销商。

我想要做的是在一个页面上显示1001获得佣金的所有订单(客户的父母和祖父母)。我被困在只选择父母,当祖父母进入混合我在深水中游泳,帮助! :)

编辑:我可能已经解决了这个问题(不知道它的hacky与否):

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

1 个答案:

答案 0 :(得分:1)

简单的答案是,您需要进行多次查询,每个级别一次,因为您遵循父ID。当你的父母用完时你会停止。

这种层次结构的设计是合乎逻辑的,显而易见的,通常不适用于关系数据库。问题是你根本无法做一个SQL查询来获取记录,所有的父母都可以登顶。要获得一条记录及其父级,您可以进行自我加入,进行第三级,您可以进行第二次自我加入,但是如何在父母用完之前继续进行?你不能。 SQL没有像这样的动态连接机制。因此,此结构的解决方案是进行多个查询。对于非常小的树木,没有巨大的性能损失。

如果您想重新设计表格以便可以使用单个查询执行操作,则需要使用名为nested sets的结构。

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