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

基于三张表多条件筛选项目数据的SQL查询方案

嘿,我来帮你搞定这两个SQL查询问题,结合你给的表结构和示例数据,咱们一步步拆解:

1. 筛选关联用户jobTypeId等于指定值的项目数据

要拿到符合要求的项目数据,核心是把项目表(Table1)和用户表(Table2)关联起来,先通过userName匹配邮箱前缀找到对应的用户,再筛选出jobTypeId符合条件的记录。针对你指定jobTypeId=2的场景,SQL可以这么写:

SELECT 
    t1.id AS projectId,
    t1.userName
FROM 
    Table1 t1
JOIN 
    Table2 t2 ON LOWER(t1.userName) = LOWER(SUBSTRING_INDEX(t2.email, '@', 1))
WHERE 
    t2.jobTypeId = '2';

关键逻辑说明:

  • SUBSTRING_INDEX(t2.email, '@', 1):这个函数专门用来截取邮箱中@之前的前缀部分,比如dLong@whatever.com会被提取成dLong。
  • LOWER():统一转成小写是为了避免大小写差异导致匹配失败(就像你示例里Table1的bDover和Table2的bdover),如果你的业务场景里大小写完全一致,可以去掉这个函数提升效率。
  • JOIN:只保留能匹配上用户的项目记录,最后通过WHERE子句筛选出jobTypeId为2的用户对应的项目。

执行这条SQL后,就能得到你给出的预期结果啦。

2. 将Table1的userName与Table2邮箱中@符号之前的前缀部分进行匹配

其实第一个问题已经用到了核心匹配逻辑,这里单独拆解出几种常见实现方式,适配不同数据库场景:

方式一:用SUBSTRING_INDEX(MySQL、MariaDB等常用)

SELECT 
    t1.id AS projectId,
    t1.userName,
    t2.email,
    SUBSTRING_INDEX(t2.email, '@', 1) AS email_prefix
FROM 
    Table1 t1
JOIN 
    Table2 t2 ON LOWER(t1.userName) = LOWER(SUBSTRING_INDEX(t2.email, '@', 1));

方式二:用LEFT+CHARINDEX(适用于SQL Server)

如果你的数据库是SQL Server,没有SUBSTRING_INDEX函数,可以用这两个函数组合来截取前缀:

SELECT 
    t1.id AS projectId,
    t1.userName,
    t2.email,
    LEFT(t2.email, CHARINDEX('@', t2.email) - 1) AS email_prefix
FROM 
    Table1 t1
JOIN 
    Table2 t2 ON LOWER(t1.userName) = LOWER(LEFT(t2.email, CHARINDEX('@', t2.email) - 1));

额外拓展:关联职位类型名称

如果需要同时显示职位名称(来自Table3),可以再加一个JOIN:

SELECT 
    t1.id AS projectId,
    t1.userName,
    t3.jobTypeName
FROM 
    Table1 t1
JOIN 
    Table2 t2 ON LOWER(t1.userName) = LOWER(SUBSTRING_INDEX(t2.email, '@', 1))
JOIN 
    Table3 t3 ON t2.jobTypeId = t3.jobTypeId
WHERE 
    t2.jobTypeId = '2';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:45:39