基于三张表多条件筛选项目数据的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
相关产品推荐
相关产品推荐

