2013-09-24 52 views
0

我试图选择一个adjecency列表中的“父”和“祖父母”节点,但不知道如何通过SELECT查询(即im初学者mysql程序员)建立线索。MySQL select parent and grandparent

我试图做一个订单系统,其中每个分销商可以看到他们在一个月内赚了多少。我从客户处获得一份订单,并且客户分销商从订单中获得佣金,分销商“母公司”分销商也获得一笔小佣金。

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

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 

回答

1

简单的答案是,你需要做多个查询,每级一个,然后按照以下父母ID。当你父母用完时你会停下来。

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

如果要重新设计表格,以便可以通过处理单个查询,则需要使用名为nested sets的结构。

(编辑:其实我刚刚发现所谓的“公用表表达式”的SQL扩展,它是专为分层数据不幸的是,MySQL不支持它。)

+0

我怎么会写SELECT语句?我不需要父母一直到顶部,总是只有2级(父母和祖父母),所以它不必是动态的 – omegan

+0

像在伪代码中,我只是想做的:选择所有订单在哪里父母或祖父母TO orders.customer_id IS 1001 – omegan

+0

如果你总是只看到两层,那么你可以找到你想要的customer_id的父代,然后找到它的父代。然后你可以做'SELECT * FROM order WHERE order_id IN()' – staticsan