You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL多表关联查询:如何实现指定格式的空值填充结果

实现筐与水果、蔬菜的对应匹配:多余水果行蔬菜列显示Null的MySQL查询

现有表结构

表1(筐信息)

序号(S.NO)筐(BOX)
1Basket1
2Basket2
3Basket3

表2(水果与筐对应)

水果筐(FRUIT BOX)水果(FRUITS)
Basket1Mango
Basket1Apple
Basket1Grapes
Basket1Banana
Basket2Banana
Basket2Apple

表3(蔬菜与筐对应)

蔬菜筐(VEGETABLES BOX)蔬菜(VEGETABLES)
Basket1Tomato
Basket1Potato
Basket2Cucumber
Basket2Potato
Basket3Tomato

当前错误查询结果

执行普通关联查询后,蔬菜列出现重复匹配:

序号(S.NO)筐(BOX)水果(FRUITS)蔬菜(VEGETABLES)
1Basket1MangoTomato
1Basket1ApplePotato
1Basket1GrapesTomato
1Basket1BananaPotato

预期结果

同一筐内水果行数多于蔬菜时,多余水果行的蔬菜列显示Null:

序号(S.NO)筐(BOX)水果(FRUITS)蔬菜(VEGETABLES)
1Basket1MangoTomato
1Basket1ApplePotato
1Basket1GrapesNull
1Basket1BananaNull

正确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;

核心逻辑

  1. ROW_NUMBER() OVER (PARTITION BY ...) 按筐分组,给每个筐内的水果、蔬菜生成递增行号;
  2. 以筐为关联条件,同时匹配行号,确保每一行水果仅对应同序号的蔬菜;
  3. 当水果行号超过同一筐的蔬菜行数时,LEFT JOIN自动返回Null,符合预期需求。

内容的提问来源于stack exchange,提问作者Imran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:50:46