無限級子商戶的查詢優化方法

  • 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);  }
Exit mobile version