使用设置在三个表上的条件进行选择

时间:2018-05-28 20:54:24

标签: sql postgresql

我试图构建的查询有三个问题。

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

表1 | id | ... | userName | ... |

另一个表格中保存了所有用户及其各自的电子邮件和作业类型

表2 | id | ... | jobTypeId | email | ... |

最后一个表有一个作业类型ID列表及其作业名称

表3 | jobTypeId | jobTypeName |

  1. 电子邮件相比,我如何才能从表1 用户名中选择项目 用户名 表2 jobTypeIds 的用户表3 等于某个值(例如" 2&#34) ;)

  2. 如何将表1 中的userName与来自表2 的电子邮件进行比较,而不包含@ whatever.com部分;仅将电子邮件的开头与用户名

  3. 进行比较

    示例数据

    表1

    | id | ... | userName | ... |  
    | 1  |     | bDover   |     |  
    | 2  |     | dLong    |     |  
    | 3  |     | eEddy    |     |  
    | 4  |     | dLong    |     |  
    | 5  |     | eEddy    |     |  
    | 6  |     | bDover   |     |  
    | 7  |     | dLong    |     |  
    | 8  |     | eEddy    |     |  
    | 9  |     | dLong    |     |  
    | 10 |     | dLong    |     |  
    

    表2

    | id | ... | jobTypeId | email                    | ... |  
    | 1  |     | 1         | bdover@whatever.com      |     |  
    | 2  |     | 2         | dLong@whatever.com       |     |  
    | 3  |     | 2         | eEddy@whatever.com       |     |  
    | 4  |     | 3         | ...@whatever.com         |     |    
    

    表3

    | jobTypeId | jobTypeName |
    | 1         | Student     |
    | 2         | Teacher     |
    | 1         | Admin       |
    

    预期结果(jobTypeId = 2)

    | projectId | userName |  
    | 2         | dLong    |  
    | 3         | eEddy    |  
    | 4         | dLong    |  
    | 5         | eEddy    |  
    | 7         | dLong    |  
    | 8         | eEddy    |  
    | 9         | dLong    |  
    | 10        | dLong    |  
    

2 个答案:

答案 0 :(得分:0)

你可以尝试一下:

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一样工作SUBSTRING_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()的更多信息:http://dataiseverything.blogspot.com/2015/01/equivalent-of-substringindex-in-mysql.html

答案 1 :(得分:0)

你似乎想要:

 <nav>
    <ul>
      <li>
        <a href="#">About</a>
        <div style="background-color: #c03546;height: 10px;"></div>
      </li>
      <li>
        <a href="#">Companies</a>
        <div style="background-color: #f26d5b;height: 10px;"></div>
      </li>
      <li>
        <a href="#">Brands</a>
        <div style="background-color: #f6ea8c;height: 10px;"></div>
      </li>
    </ul>
</nav>

您不需要select t1.projectid, t1.username from table1 t1 join table2 t2 on t2.email like t1.username || '@%' where t2.jobtypeid = 2; ,因为您正在比较作业类型ID,而不是名称。

您还应该修复数据模型,因此table3会使用table1table2的ID,而不是比较用户名和电子邮件。