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

MySQL多表关联查询:根据Notes表数据填充字段需求

解决MySQL多表关联查询问题

我来帮你搞定这个多表查询需求!先理清楚三张表的关联逻辑,然后直接给你可用的SQL语句,再拆解解释。

需求复盘

你需要查询客户ID=2的所有数据,最后一列要标记:当该客户的作业存在对应备注时(匹配规则是Data.key_name='RO No'的key_value等于Notes.ro_no),显示任意值(比如备注内容或“有备注”标记)。

关联逻辑梳理

  1. Header表是核心,通过header_id关联Data表,获取该客户的所有报告数据
  2. Notes表是通过RO No关联的——需要先从Data表中提取每个Header对应的RO No值,再和Notes表的ro_no匹配

最终SQL语句

SELECT 
    h.id AS header_id,
    h.customer_id,
    h.last_updated,
    d.key_name,
    d.key_value,
    -- 这里可以换成任意你想要显示的值,比如直接用n.note显示备注内容
    CASE WHEN n.note IS NOT NULL THEN '✅ 存在备注' ELSE NULL END AS has_remark
FROM Header h
-- 关联获取该客户的所有Data数据
INNER JOIN Data d ON h.id = d.header_id
-- 子查询提取每个Header对应的RO No值
LEFT JOIN (
    SELECT header_id, key_value AS ro_no
    FROM Data
    WHERE key_name = 'RO No'
) ro_info ON h.id = ro_info.header_id
-- 左关联Notes,确保没有备注的行也能显示
LEFT JOIN Notes n ON ro_info.ro_no = n.ro_no
WHERE h.customer_id = 2
-- 可选:按Header和key_name排序,让结果更规整
ORDER BY h.id, d.key_name;

代码解释

  • INNER JOIN Data:确保只获取客户ID=2对应的所有报告数据
  • 子查询ro_info:专门提取每个作业的RO No,这是关联Notes的关键
  • LEFT JOIN Notes:即使没有匹配的备注,原数据依然会保留,不会被过滤掉
  • CASE语句:根据是否存在备注返回你需要的任意值,你可以直接替换成n.note来显示备注内容,或者其他自定义标记

如果你的需求是只有key_name='RO No'的行才显示备注标记,可以调整CASE条件:

CASE 
    WHEN d.key_name = 'RO No' AND n.note IS NOT NULL THEN '✅ 存在备注' 
    ELSE NULL 
END AS has_remark

内容的提问来源于stack exchange,提问作者php-b-grader

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:53:25