2013-09-24 82 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