摘要:需求數據表如下表表需求是得到以下結構的數據測試部門方法一循環查詢查詢用戶列表循環用戶列表查詢對應的部門信息該方法查詢次數為次查詢列表,次查詢部門,性能最低,不可取。
需求
數據表如下:
department表
|id|name|
user表
|id|name|department_id|
需求是得到以下結構的數據:
[ { "id":1, "name":"test", "department_id":1, "department":{ "id":1, "name":"測試部門" } } ]方法一:循環查詢
查詢用戶列表
循環用戶列表查詢對應的部門信息
$users = $db->query("SELECT * FROM `user`"); foreach($users as &$user) { $users["department"] = $db->query("SELECT * FROM `department` WHERE `id` = ".$user["department_id"]); }
該方法查詢次數為:1+N(1次查詢列表,N次查詢部門),性能最低,不可取。
方法二:連表通過連表查詢用戶和部門數據
處理返回數據
$users = $db->query("SELECT * FROM `user` INNER JOIN `department` ON `department`.`id` = `user`.`department_id`"); // 手動處理返回結果為需求結構
該方法其實也有局限性,如果 user 和 department 不在同一個服務器是不可以連表的。
方法三:1+1查詢該方法先查詢1次用戶列表
取出列表中的部門ID組成數組
查詢步驟2中的部門
合并最終數據
代碼大致如下:
$users = $db->query("SELECT * FROM `user`"); $departmentIds =[ ]; foreach($users as $user) { if(!in_array($user["department_id"], $departmentIds)) { $departmentIds[] = $user["department_id"]; } } $departments = $db->query("SELECT * FROM `department` WHERE id in (".join(",",$department_id).")"); $map = []; // [部門ID => 部門item] foreach($departments as $department) { $map[$department["id"]] = $department; } foreach($users as $user) { $user["department"] = $map[$user["department_id"]] ?? null; }
該方法對兩個表沒有限制,在目前微服務盛行的情況下是比較好的一種做法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31750.html
摘要:方案二布隆過濾器攔截布隆過濾器介紹概念布隆過濾器英語是年由布隆提出的。這就是布隆過濾器的基本思想。防緩存穿透的布隆過濾器判斷是否為合法非法則不允許繼續查庫從緩存中獲取數據緩存為空從數據庫中獲取緩存空對象參考書籍開發與運維 上周在工作中遇到了一個問題場景,即查詢商品的配件信息時(商品:配件為1:N的關系),如若商品并未配置配件信息,則查數據庫為空,且不會加入緩存,這就會導致,下次在查詢同...
閱讀 3300·2021-09-30 09:54
閱讀 3782·2021-09-22 15:01
閱讀 3105·2021-08-27 16:19
閱讀 2572·2019-08-29 18:39
閱讀 2146·2019-08-29 14:09
閱讀 623·2019-08-26 10:23
閱讀 1337·2019-08-23 12:01
閱讀 1862·2019-08-22 13:57