MySQL多表单查询需求:已知协调员user_id查所属项目关联学校
单条SQL实现需求方案
根据你的数据表结构和需求,我们可以通过表关联(JOIN)或者嵌套子查询将三步查询合并为单条SQL,直接获取目标学校数据。
方案1:使用JOIN串联关联表
这种方式通过多次关联coordinator表串联关系,逻辑清晰,在有索引的场景下性能更优:
SELECT DISTINCT s.school_id, s.school_name, s.school_phone, s.school_email FROM coordinator c1 JOIN coordinator c2 ON c1.project_id = c2.project_id JOIN school s ON c2.coordinator_id = s.coordinator_id WHERE c1.user_id = 2;
逻辑说明:
- 通过
c1表筛选出指定user_id(示例为2)对应的所有项目project_id - 通过
c2表关联这些项目,获取该项目下的所有协调员coordinator_id - 关联
school表,得到这些协调员负责的所有学校 - 用
DISTINCT避免重复的学校记录(如果同一学校被多个同项目协调员关联)
方案2:使用嵌套子查询
如果更习惯子查询的写法,可以用多层IN子查询实现:
SELECT DISTINCT school_id, school_name, school_phone, school_email FROM school WHERE coordinator_id IN ( SELECT coordinator_id FROM coordinator WHERE project_id IN ( SELECT project_id FROM coordinator WHERE user_id = 2 ) );
逻辑说明:
从内到外依次执行:
- 最内层子查询:获取指定
user_id参与的所有项目ID - 中间层子查询:获取这些项目下的所有协调员ID
- 最外层查询:获取这些协调员关联的所有学校
注意事项
- 如果只需要
school_id,可以去掉其他字段,和你原来的第三步查询结果一致 - 建议给以下字段添加索引,提升查询效率:
coordinator.user_idcoordinator.project_idschool.coordinator_id
- 如果你的业务场景中不会出现同一学校被多个同项目协调员关联的情况,可以去掉
DISTINCT
内容的提问来源于stack exchange,提问作者ugsgknt
相关产品推荐
相关产品推荐

