左连接层级表产生重复行的问题与解决思路
关联层级类别表时重复记录问题及优化方案
现有两张表:wallet_balance_history(钱包余额历史表)和层级结构的categories(类别表)。当查询wallet_balance_history关联顶级父类别时结果正常,但查询下级类别时,由于对应category_id存在多个子category_id,会导致同一条wallet_balance_history记录被重复输出。
示例表结构
wallet_balance_history表
| ID | category_id |
|---|---|
| 1 | 4 |
| 2 | 4 |
categories表
| ID | parent_id | name |
|---|---|---|
| 4 | null | x1 |
| 5 | 4 | x1.1 |
| 6 | 4 | x1.2 |
问题复现SQL
select wbh.id id, c1.name c1, c2.name c2, c3.name c3 from wallets_balance_history wbh left join categories c1 on wbh.category_id = c1.id left join categories c2 on c2.parent_id = c1.id left join categories c3 on c3.parent_id = c2.id where wbh.id = 1;
查询结果(出现重复)
| ID | c1 | c2 |
|---|---|---|
| 1 | x1 | x1.1 |
| 1 | x1 | x1.2 |
需求
要求每个wallet_balance_history行(按ID唯一)最多对应一组c1、c2、c3值,避免重复。
优化方案
- 方案1:存储最下层子类别ID
将wallet_balance_history.category_id存储为最底层的子类别ID,通过向上追溯获取各级父类别。但此方案无法固定类别层级,会引入其他复杂度。 - 方案2:创建桥接表
新增一张桥接表,建立wallet_balance_history.id与对应所有层级类别/子类别之间的映射关系,通过桥接表关联查询避免重复。
内容的提问来源于stack exchange,提问作者Hawk
相关产品推荐
相关产品推荐

