無限級子商戶的查詢優化方法
- 2019 年 12 月 15 日
- 筆記
無限級平台必須解決的一個問題,分享一下我在網上學習到的方法。
假設平台有這樣的上下級關係
A 有 2 個直接下級B、C, B有2個直接下級D、E, C有2個直接下級F、G
我們正常的做法是使用遞歸這樣操作:先查詢出所有上級為A的子商戶,再查詢所有上級為上一個查詢結果的子商戶。如第一步查詢出B、C,第二步查詢所有上級為B、C的商戶(mysql的 IN 範圍條件實現)。
這樣的遞歸查詢耗時是非常長的。(個人覺得具體消耗在連接mysql資料庫的次數上)
現在我們的做法是這樣的:一次性查詢出所有的商戶資訊(id、上級id),並且按正序排列(添加時間,因為要有第三級的商戶必須先有第二級商戶,按正序排列才可以正常得到結果)
<?php function getTeamMember($allMembers, $id){ $teams = []; // 在$id下的所有商戶id數組,最終的返回結果 $teams[$id] = $id; // 把我們要查詢的這個id先添加在這個數組裡,設置的值任意,只要讓這個鍵值存在即可。 // 遍歷每一個會員資訊 foreach($allMembers as $key => $v){ // 判斷遍歷到的這個會員上級是否在團隊數組裡 (判斷鍵值) if( isset( $teams[$v['p_id'] ] ) ){ // 該會員的上級屬於團隊 追加進團隊 $teams[ $v['id'] ] = 123; // 也是任意值 存在即可 } // 遍歷完就把這個會員的資訊刪除~不需要儲存了 unset($allMembers[$key]); } // 把我們第二步傳遞進來的自身的$id刪除掉 也就是第一個 unset($teams[$id]); // 返回數據 return array_keys($teams); }