SQL中如何根据传入的父ID参数获取关联的子记录名称?

问题描述
基于上述层级关系场景,请问通过传入的父级ID参数,获取关联子级名称的最优方法是什么?
示例:
- 传入父级ID为1,需返回对应的子级名称:Emily、Alexander和Sophia
- 传入父级ID为7,需返回对应的子级名称:Olivia和James
最优解决方案
根据数据存储的不同场景,最优方法分为以下两种:
1. 数据库存储场景:直接SQL条件查询
如果数据存储在关系型数据库(如MySQL、PostgreSQL)中,假设表结构包含id(主键)、name(子级名称)、parent_id(关联父级ID)字段,直接执行精准条件查询是性能最优的方式:
SELECT name FROM users WHERE parent_id = ?;
将占位符?替换为传入的父级ID,查询结果直接提取name字段即可得到子级名称列表。
若需要直接输出示例中的拼接格式,可使用数据库聚合函数:
- MySQL:
SELECT GROUP_CONCAT(name SEPARATOR '、') AS child_names FROM users WHERE parent_id = ?;
- PostgreSQL:
SELECT STRING_AGG(name, '、') AS child_names FROM users WHERE parent_id = ?;
2. 内存数据场景:预构建哈希映射
如果数据已加载到内存(如数组、列表),提前按parent_id构建哈希映射(字典),可实现O(1)时间复杂度的查询,适合多次查询的场景:
预构建映射(仅执行一次)
以Python为例:
# 假设原始数据结构 user_list = [ {"id": 1, "name": "John", "parent_id": None}, {"id": 2, "name": "Emily", "parent_id": 1}, {"id": 3, "name": "Alexander", "parent_id": 1}, {"id": 4, "name": "Sophia", "parent_id": 1}, {"id": 7, "name": "Michael", "parent_id": None}, {"id": 8, "name": "Olivia", "parent_id": 7}, {"id": 9, "name": "James", "parent_id": 7} ] # 构建父ID到子名称列表的映射 parent_child_map = {} for user in user_list: pid = user["parent_id"] if pid not in parent_child_map: parent_child_map[pid] = [] parent_child_map[pid].append(user["name"])
快速查询
def fetch_child_names(target_parent_id): return parent_child_map.get(target_parent_id, []) # 示例调用 print(fetch_child_names(1)) # 输出: ['Emily', 'Alexander', 'Sophia'] print(fetch_child_names(7)) # 输出: ['Olivia', 'James']
内容的提问来源于stack exchange,提问作者S_A
相关产品推荐
相关产品推荐

