文章目錄
- 問題描述
- 先看結果
- 表結構展示
- 實現遞歸查詢集合
- 查詢結果
- 修復數據
問題描述
最近開發過程中遇到一個問題,每次添加代理關系都要去遞歸查詢一下它在不在這個代理關系樹上.很麻煩也很浪費資源.想著把代理關系的父類全部存起來
先看結果
表結構展示
表名(t_agent_user_relation) | ||
字段名 | 字段類型 | 描述 |
current_user_id | int | 當前用戶id |
superior_user_id | int | 代理用戶id |
parent_ids | varchar | 父類Id集合以逗號隔開 |
parent_id | int | 父類ID |
id | int | 主鍵 |
實現遞歸查詢集合
因為沒有對應函數,需要自行編寫遞歸查詢函數
createdefiner = root@`%` function getParentIds(child_id int) returns varchar(255)
BEGINDECLARE parent_id varchar(255) default '';DECLARE parent_ids VARCHAR(1500) default '';DECLARE count int;DECLARE sum int default 0;-- 獲取當前子類的父類IDSELECT superior_user_id INTO parent_id FROM t_agent_user_relation WHERE current_user_id = child_id;-- 遞歸查詢所有父類IDWHILE parent_id is not null && sum < 3DOSET parent_ids = CONCAT_WS(',', parent_ids, parent_id);SELECT count(1) into count FROM t_agent_user_relation WHERE current_user_id = parent_id;if count = 0 thenset parent_id = null;elseSELECT superior_user_id INTO parent_id FROM t_agent_user_relation WHERE current_user_id = parent_id;end if;-- 防止出現死循環if parent_id is not null && find_in_set(parent_id, parent_ids) > 0thenset sum = sum + 1;elseset sum = sum;end if;END WHILE;RETURN parent_ids;
END;
如果出現以下錯誤
[HY000][1418] This function has none of DETERMINISTIC, NO SQL, or READS SQL
執行
set global log_bin_trust_function_creators = 1;
錯誤原因我就不在這里分析了,有興趣的自己查詢一下
查詢結果
select current_user_id,superior_user_id,getParentIds(current_user_id) from t_agent_user_relation
修復數據
update t_agent_user_relation set parent_ids= getParentIds(current_user_id) where parent_ids is null