MySQL多表关联查询:根据Notes表数据填充字段需求
解决MySQL多表关联查询问题
我来帮你搞定这个多表查询需求!先理清楚三张表的关联逻辑,然后直接给你可用的SQL语句,再拆解解释。
需求复盘
你需要查询客户ID=2的所有数据,最后一列要标记:当该客户的作业存在对应备注时(匹配规则是Data.key_name='RO No'的key_value等于Notes.ro_no),显示任意值(比如备注内容或“有备注”标记)。
关联逻辑梳理
Header表是核心,通过header_id关联Data表,获取该客户的所有报告数据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
相关产品推荐
相关产品推荐

