0

我试图在邻接列表中选择“父”和“祖父”节点,但不知道如何通过 SELECT 查询构建(我是初学者 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。distributor_id 为 0 仅表示没有父分销商。

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

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

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
4

1 回答 1

1

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

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

如果你想重新设计你的表以便你可以用单个查询来做事情,你需要使用一个叫做嵌套集合的结构。

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

于 2013-09-24T02:22:29.837 回答