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

MySQL多表关联查询:筛选所有关联记录含指定字符串的公司

嘿,我来帮你搞定这个查询需求!首先咱们先理清楚你的表关联逻辑:n_companies 和 n_contacts 通过 company_id 关联,n_contacts 又和 n_custom 通过 custom_type='contacts' + custom_type_id = n_contacts.id 关联。你要找的是所有关联记录(该公司下所有联系人对应的自定义记录)都包含指定字符串的公司,对吧?

先回顾下你的表结构

n_companies 表:

idcompany_name
1Company A
2Company B

n_contacts 表:

idcompany_idcontact_name
11John
21Frank
32Bobby
42Sophie

n_custom 表:

idcustom_typecustom_type_idgenderfav_colour
1contacts1malered
2contacts2malered
3contacts3malered
4contacts4femalegreen

解决方案:两种高效实现方式

下面以「找所有联系人的 fav_colour 都是 'red' 的公司」为例,你可以根据实际需求替换字段和匹配条件(比如模糊匹配用 LIKE '%指定字符串%')。

方法1:GROUP BY + HAVING 统计匹配数

这种方法通过统计公司的总关联记录数,和符合条件的记录数,当两者相等时,说明所有记录都满足要求:

SELECT c.id, c.company_name
FROM n_companies c
JOIN n_contacts con ON c.id = con.company_id
JOIN n_custom cu ON cu.custom_type = 'contacts' AND cu.custom_type_id = con.id
GROUP BY c.id, c.company_name
HAVING COUNT(*) = SUM(CASE WHEN cu.fav_colour = 'red' THEN 1 ELSE 0 END);

逻辑解释:

  • COUNT(*) 统计当前公司下所有关联的自定义记录总数
  • SUM(CASE...) 统计其中符合指定条件的记录数
  • 只有当两者相等时,才能证明该公司的所有关联记录都包含指定字符串

方法2:NOT EXISTS 排除不符合的公司

这种方法逻辑更直观:直接找「不存在任何关联记录不符合条件」的公司:

SELECT c.id, c.company_name
FROM n_companies c
WHERE NOT EXISTS (
    SELECT 1
    FROM n_contacts con
    JOIN n_custom cu ON cu.custom_type = 'contacts' AND cu.custom_type_id = con.id
    WHERE con.company_id = c.id
      AND cu.fav_colour != 'red' -- 这里是"不满足条件"的判断
);

逻辑解释:

  • 子查询会检查当前公司下是否存在一条关联记录不包含指定字符串
  • 如果 NOT EXISTS 这个子查询的结果,就说明该公司所有记录都符合要求

适配你的搜索UI三种模式

如果你的UI支持「任意/全部/无记录包含」三种搜索模式,可以基于上面的代码快速调整:

  • 任意包含:把方法1的 HAVING COUNT(*) = SUM(...) 改成 HAVING SUM(...) > 0;或者把方法2的 NOT EXISTS 换成 EXISTS,并把子查询里的条件改成「符合条件」
  • 无记录包含:把方法1的 HAVING 改成 SUM(...) = 0;或者把方法2的子查询条件改成「符合条件」,保留 NOT EXISTS

比如「无记录包含'red'」的查询:

SELECT c.id, c.company_name
FROM n_companies c
WHERE NOT EXISTS (
    SELECT 1
    FROM n_contacts con
    JOIN n_custom cu ON cu.custom_type = 'contacts' AND cu.custom_type_id = con.id
    WHERE con.company_id = c.id
      AND cu.fav_colour = 'red'
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:02:52