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

MySQL多表关联查询:如何筛选join表中人员关联自身所属公司的错误条目

问题说明

我有一个基于4张MySQL表的应用,表结构如下:

persons
------------
id              -- 主键,唯一
name
entity_id       -- 外键关联 entities 表

entities
------------
id              -- 主键,唯一
name
company_id      -- 外键关联 companies 表

companies
------------
id              -- 主键,唯一
name

persons_linked_companies -- 人员与公司关联表
--------------------------
id              -- 主键,唯一
persons_id      -- 外键关联 persons 表
companies_id    -- 外键关联 companies 表

业务规则如下:

  • 每个人员归属一个实体
  • 每个实体归属一个公司
  • 一个人员仅能关联一个实体
  • 一个实体仅能关联一个公司
  • 一个人员可以关联一个或多个其他第三方公司,关联关系存储在 persons_linked_companies 表中
  • 人员可以关联多个公司,但不允许关联自己所属的公司

需求是查询 persons_linked_companies 表中的无效记录:即关联的公司和人员自身所属公司相同的条目。

你之前编写的伪代码存在语法问题,MySQL 不支持直接通过 表.关联表.字段 的链式写法访问跨表字段,需要通过关联查询或者子查询打通表关系后做对比。

解决方案

方案1:关联查询(推荐)

性能更优,可直接带出人员、关联公司的明细信息方便核对:

SELECT 
  plc.id AS invalid_link_id,
  plc.persons_id AS person_id,
  p.name AS person_name,
  plc.companies_id AS linked_company_id,
  c.name AS linked_company_name
FROM persons_linked_companies plc
INNER JOIN persons p ON plc.persons_id = p.id
INNER JOIN entities e ON p.entity_id = e.id
INNER JOIN companies c ON plc.companies_id = c.id
WHERE plc.companies_id = e.company_id;

方案2:子查询实现

如果仅需要获取无效关联记录的ID,可以用子查询写法:

SELECT id AS invalid_link_id
FROM persons_linked_companies plc
WHERE plc.companies_id = (
  SELECT e.company_id
  FROM persons p
  INNER JOIN entities e ON p.entity_id = e.id
  WHERE p.id = plc.persons_id
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:27:02