Sql 在三个表上设置条件进行选择

Sql 在三个表上设置条件进行选择,sql,postgresql,Sql,Postgresql,对于我试图构建的查询,有三个表存在问题 一个表包含与正在处理该项目的用户名关联的项目条目 表1 | id |……|用户名|| 另一个表中保存了所有用户及其各自的电子邮件和作业类型 表2 | id |……|jobTypeId |电子邮件|| 最后一个表包含作业类型ID及其作业名称的列表 表3 |作业类型ID |作业类型名称| 我如何才能只从表1中选择项目,其中用户名与表2中的电子邮件相比,是表3中的作业类型ID等于某个值的用户(例如“2”) 如何比较表1中的用户名和表2中的电子邮件,而不包含@wh

对于我试图构建的查询,有三个表存在问题

一个表包含与正在处理该项目的用户名关联的项目条目

表1
| 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
    ,而不是比较用户名和电子邮件。

    我想您应该先为我们构建一个数据和期望的结果。