Sql 在三个表上设置条件进行选择
对于我试图构建的查询,有三个表存在问题 一个表包含与正在处理该项目的用户名关联的项目条目 表1Sql 在三个表上设置条件进行选择,sql,postgresql,Sql,Postgresql,对于我试图构建的查询,有三个表存在问题 一个表包含与正在处理该项目的用户名关联的项目条目 表1 | id |……|用户名|| 另一个表中保存了所有用户及其各自的电子邮件和作业类型 表2 | id |……|jobTypeId |电子邮件|| 最后一个表包含作业类型ID及其作业名称的列表 表3 |作业类型ID |作业类型名称| 我如何才能只从表1中选择项目,其中用户名与表2中的电子邮件相比,是表3中的作业类型ID等于某个值的用户(例如“2”) 如何比较表1中的用户名和表2中的电子邮件,而不包含@wh
| id |……|用户名||代码>
另一个表中保存了所有用户及其各自的电子邮件和作业类型
表2
| id |……|jobTypeId |电子邮件||代码>
最后一个表包含作业类型ID及其作业名称的列表
表3
|作业类型ID |作业类型名称|
我如何才能只从表1中选择项目,其中用户名与表2中的电子邮件相比,是表3中的作业类型ID等于某个值的用户(例如“2”)
如何比较表1中的用户名和表2中的电子邮件,而不包含@where.com部分;仅将电子邮件的开头与用户名进行比较
示例数据
表1
| id | ... | userName | ... |
| 1 | | bDover | |
| 2 | | dLong | |
| 3 | | eEddy | |
| 4 | | dLong | |
| 5 | | eEddy | |
| 6 | | bDover | |
| 7 | | dLong | |
| 8 | | eEddy | |
| 9 | | dLong | |
| 10 | | dLong | |
| id | ... | jobTypeId | email | ... |
| 1 | | 1 | bdover@whatever.com | |
| 2 | | 2 | dLong@whatever.com | |
| 3 | | 2 | eEddy@whatever.com | |
| 4 | | 3 | ...@whatever.com | |
| jobTypeId | jobTypeName |
| 1 | Student |
| 2 | Teacher |
| 1 | Admin |
| projectId | userName |
| 2 | dLong |
| 3 | eEddy |
| 4 | dLong |
| 5 | eEddy |
| 7 | dLong |
| 8 | eEddy |
| 9 | dLong |
| 10 | dLong |
表2
| id | ... | userName | ... |
| 1 | | bDover | |
| 2 | | dLong | |
| 3 | | eEddy | |
| 4 | | dLong | |
| 5 | | eEddy | |
| 6 | | bDover | |
| 7 | | dLong | |
| 8 | | eEddy | |
| 9 | | dLong | |
| 10 | | dLong | |
| id | ... | jobTypeId | email | ... |
| 1 | | 1 | bdover@whatever.com | |
| 2 | | 2 | dLong@whatever.com | |
| 3 | | 2 | eEddy@whatever.com | |
| 4 | | 3 | ...@whatever.com | |
| jobTypeId | jobTypeName |
| 1 | Student |
| 2 | Teacher |
| 1 | Admin |
| projectId | userName |
| 2 | dLong |
| 3 | eEddy |
| 4 | dLong |
| 5 | eEddy |
| 7 | dLong |
| 8 | eEddy |
| 9 | dLong |
| 10 | dLong |
表3
| id | ... | userName | ... |
| 1 | | bDover | |
| 2 | | dLong | |
| 3 | | eEddy | |
| 4 | | dLong | |
| 5 | | eEddy | |
| 6 | | bDover | |
| 7 | | dLong | |
| 8 | | eEddy | |
| 9 | | dLong | |
| 10 | | dLong | |
| id | ... | jobTypeId | email | ... |
| 1 | | 1 | bdover@whatever.com | |
| 2 | | 2 | dLong@whatever.com | |
| 3 | | 2 | eEddy@whatever.com | |
| 4 | | 3 | ...@whatever.com | |
| jobTypeId | jobTypeName |
| 1 | Student |
| 2 | Teacher |
| 1 | Admin |
| projectId | userName |
| 2 | dLong |
| 3 | eEddy |
| 4 | dLong |
| 5 | eEddy |
| 7 | dLong |
| 8 | eEddy |
| 9 | dLong |
| 10 | dLong |
预期结果(jobTypeId=2)
| id | ... | userName | ... |
| 1 | | bDover | |
| 2 | | dLong | |
| 3 | | eEddy | |
| 4 | | dLong | |
| 5 | | eEddy | |
| 6 | | bDover | |
| 7 | | dLong | |
| 8 | | eEddy | |
| 9 | | dLong | |
| 10 | | dLong | |
| id | ... | jobTypeId | email | ... |
| 1 | | 1 | bdover@whatever.com | |
| 2 | | 2 | dLong@whatever.com | |
| 3 | | 2 | eEddy@whatever.com | |
| 4 | | 3 | ...@whatever.com | |
| jobTypeId | jobTypeName |
| 1 | Student |
| 2 | Teacher |
| 1 | Admin |
| projectId | userName |
| 2 | dLong |
| 3 | eEddy |
| 4 | dLong |
| 5 | eEddy |
| 7 | dLong |
| 8 | eEddy |
| 9 | dLong |
| 10 | dLong |
您可以尝试一下:
SELECT
t1.id as ProjectID, t1.userName
FROM
TABLE1 AS t1,
TABLE2 AS t2,
TABLE3 AS t3
WHERE
TRIM(t1.userName) = TRIM(split_part(t2.email, "@", 1))
&& t2.jobTypeId = t3.jobTypeId
&& t3.jobTypeId = 2
GROUP BY
ProjectID
这假设Postgres split_part()与MySQL一样可以使用子字符串_INDEX()
编辑2:如果table2.jobTypeId=2的行数较少,则WHERE子句应如下所示:
WHERE
t3.jobTypeId = 2
&& t3.jobTypeId = t2.jobTypeId
&& TRIM(split_part(t2.email, "@", 1)) = TRIM(t1.userName)
编辑:我添加了TRIM,以防数据的格式可能包含用户名和电子邮件上的空白。下面是关于在Postgres中使用SPLIT_PART()的更多信息:您似乎想要:
select t1.projectid, t1.username
from table1 t1 join
table2 t2
on t2.email like t1.username || '@%'
where t2.jobtypeid = 2;
您不需要表3
,因为您正在比较作业类型ID,而不是名称
您还应该修复数据模型,因此table1
使用table2
中的id来加入join
,而不是比较用户名和电子邮件。我想您应该先为我们构建一个数据和期望的结果。