MySQL多表关联查询:如何实现指定格式的空值填充结果
实现筐与水果、蔬菜的对应匹配:多余水果行蔬菜列显示Null的MySQL查询
现有表结构
表1(筐信息)
| 序号(S.NO) | 筐(BOX) |
|---|---|
| 1 | Basket1 |
| 2 | Basket2 |
| 3 | Basket3 |
表2(水果与筐对应)
| 水果筐(FRUIT BOX) | 水果(FRUITS) |
|---|---|
| Basket1 | Mango |
| Basket1 | Apple |
| Basket1 | Grapes |
| Basket1 | Banana |
| Basket2 | Banana |
| Basket2 | Apple |
表3(蔬菜与筐对应)
| 蔬菜筐(VEGETABLES BOX) | 蔬菜(VEGETABLES) |
|---|---|
| Basket1 | Tomato |
| Basket1 | Potato |
| Basket2 | Cucumber |
| Basket2 | Potato |
| Basket3 | Tomato |
当前错误查询结果
执行普通关联查询后,蔬菜列出现重复匹配:
| 序号(S.NO) | 筐(BOX) | 水果(FRUITS) | 蔬菜(VEGETABLES) |
|---|---|---|---|
| 1 | Basket1 | Mango | Tomato |
| 1 | Basket1 | Apple | Potato |
| 1 | Basket1 | Grapes | Tomato |
| 1 | Basket1 | Banana | Potato |
预期结果
同一筐内水果行数多于蔬菜时,多余水果行的蔬菜列显示Null:
| 序号(S.NO) | 筐(BOX) | 水果(FRUITS) | 蔬菜(VEGETABLES) |
|---|---|---|---|
| 1 | Basket1 | Mango | Tomato |
| 1 | Basket1 | Apple | Potato |
| 1 | Basket1 | Grapes | Null |
| 1 | Basket1 | Banana | Null |
正确MySQL查询语句
通过给每个筐内的水果、蔬菜添加分组行号,再基于筐和行号关联,实现精准匹配:
SELECT t1.`序号(S.NO)`, t1.`筐(BOX)`, t2.`水果(FRUITS)`, t3.`蔬菜(VEGETABLES)` FROM 表1 t1 LEFT JOIN ( SELECT `水果筐(FRUIT BOX)`, `水果(FRUITS)`, ROW_NUMBER() OVER (PARTITION BY `水果筐(FRUIT BOX)` ORDER BY `水果(FRUITS)`) AS row_num FROM 表2 ) t2 ON t1.`筐(BOX)` = t2.`水果筐(FRUIT BOX)` LEFT JOIN ( SELECT `蔬菜筐(VEGETABLES BOX)`, `蔬菜(VEGETABLES)`, ROW_NUMBER() OVER (PARTITION BY `蔬菜筐(VEGETABLES BOX)` ORDER BY `蔬菜(VEGETABLES)`) AS row_num FROM 表3 ) t3 ON t1.`筐(BOX)` = t3.`蔬菜筐(VEGETABLES BOX)` AND t2.row_num = t3.row_num ORDER BY t1.`序号(S.NO)`, t2.row_num;
核心逻辑
ROW_NUMBER() OVER (PARTITION BY ...)按筐分组,给每个筐内的水果、蔬菜生成递增行号;- 以筐为关联条件,同时匹配行号,确保每一行水果仅对应同序号的蔬菜;
- 当水果行号超过同一筐的蔬菜行数时,
LEFT JOIN自动返回Null,符合预期需求。
内容的提问来源于stack exchange,提问作者Imran
相关产品推荐
相关产品推荐

