2015-01-15 119 views
0

我有一個數據「產品」表和第二個表「product_components」。Mysql/PHP無限子查詢

「產品」由任意數量的「product_components」組成,每個「product_components」本身也可以有任意數量的「product_components」。產品和組件使用第三個表「product_bom」鏈接。

成本存儲在「product_components」級別。

我可以輕鬆地通過合併每個「產品」行來獲得組件的價格,並且我可以在其內部重複查詢以查找第二層組件。

任何人都可以建議我可以無限檢查每個組件的每個組件的另一個級別的組件...........等。

感謝,

Euphbasio

更新: 這是我頂層基本查詢。我可以在最終的循環中嵌套一個這樣的副本,然後再次,這意味着有限的可能性。

SELECT `product_bom`.*, `products_boml`.`product_code` AS `pcode`,`products_boml`.`title` AS `title`, IF(`currency_rates`.`rate`>0,`products_boml`.`cost` * `currency_rates`.`rate`,`products_boml`.`cost`) AS `pcost`,`currency`.`currency` AS `curletters`FROM `product_bom` LEFT JOIN `products` `products_boml` ON `products_boml`.`id`=`product_bom`.`bom_part_id` 
LEFT JOIN `products` `products_tlp` ON `products_tlp`.`id`='$product_id' 
LEFT JOIN `business_relations` `br_boml_vendor` ON `br_boml_vendor`.`id`=`products_boml`.`vendor_id` 
LEFT JOIN `business_relations` `br_tlp_vendor` ON `br_tlp_vendor`.`id`=`products_tlp`.`vendor_id` 
LEFT JOIN `currency_rates` ON `currency_rates`.`base_currency_id`=`br_boml_vendor`.`currency` AND `currency_rates`.`exchange_currency_id`=`br_tlp_vendor`.`currency` 
LEFT JOIN `currency` ON `currency`.`id`=`br_tlp_vendor`.`currency` 
WHERE `product_bom`.`product_id`='$product_id' 
ORDER BY `products_boml`.`product_code` 

我正在轉換貨幣也,但可以忽略。

謝謝。

+1

添加代碼片段 – Rasel

+0

mysql無法順利執行無限遞歸,但是您可以使用輕微不同的數據模型實現類似的結果http://stackoverflow.com/questions/3704130/recursive-mysql-query或通過做一些像存儲過程http://guilhembichot.blogspot.co.uk/2013/11/with-recursive-and-mysql.html(但是你必須在每個深度級別手動編寫SP路由) – Dave

+0

謝謝,我會去看看這些。似乎沒有太多的選擇...... – euphbasio

回答

0

我自己也有類似的問題,我所做的是在product_components中爲頂級設置「parent_id」,它將搜索product_components id作爲其parent_id的產品。

讓我知道這是否合理:)!

因此,例如:

Product_1從Product_2和Product_3提出,Product_3從Product_4和Product_5製造。

Product_3 id爲3,Product_4和Product_5有3

所以PARENT_ID使Product_1它會經歷Product_2並查找「PARENT_ID = 2」找不着,去Product_3並查找「PARENT_ID = 3「,我認爲你得到了jist。

另一種方法是添加一個名爲「組件」的字段,並用逗號分隔組件(區分ID)並使用「爆炸」來獲取列表,即Product_3組件列將會讀取「4,5」並且你會使用$ productarray = explode(',',Product_3)。 (僞代碼)

+0

謝謝你。我不確定這些會允許無限遞歸嗎?例如,如果組件具有包含組件的組件......仍然有未知數量的子組件。試圖讓我的頭繞過它...... – euphbasio

+0

「另一種方法是添加一個名爲」組件「的字段,並用逗號分隔組件(區分ID)並使用」爆炸「來獲取列表,即Product_3組件列會讀「4,5」,你會使用$ productarray = explode(',',Product_3)。(僞代碼)「 你看完整的帖子:P –