我试图在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
答案 0 :(得分:1)
简单的答案是,您需要进行多次查询,每个级别一次,因为您遵循父ID。当你的父母用完时你会停止。
这种层次结构的设计是合乎逻辑的,显而易见的,通常不适用于关系数据库。问题是你根本无法做一个SQL查询来获取记录,所有的父母都可以登顶。要获得一条记录及其父级,您可以进行自我加入,进行第三级,您可以进行第二次自我加入,但是如何在父母用完之前继续进行?你不能。 SQL没有像这样的动态连接机制。因此,此结构的解决方案是进行多个查询。对于非常小的树木,没有巨大的性能损失。
如果您想重新设计表格以便可以使用单个查询执行操作,则需要使用名为nested sets的结构。
(编辑:实际上我刚刚发现了一个名为“Common Table Expressions”的SQL扩展,它是为分层数据设计的。不幸的是,MySQL不支持它。)