首页 > 解决方案 > 在三个表上设置条件进行选择

问题描述

对于我正在尝试构建的查询,有三个有问题的表。

一个表具有与正在处理该项目的用户名相关联的项目条目。

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

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

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

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

表3 | jobTypeId | jobTypeName |

  1. 我如何才能只从表 1中选择项目,其中用户名与表 2 中的电子邮件相比是表 3 中的 jobTypeIds等于某个值(例如2 ”)的用户

  2. 如何在不包含 @whatever.com 部分的情况下将表 1中的用户名与表2中的电子邮件进行比较;仅将电子邮件的开头与用户名进行比较

示例数据

表格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    |  

标签: sqlpostgresql

解决方案


你似乎想要:

select t1.projectid, t1.username
from table1 t1 join
     table2 t2
     on t2.email like t1.username || '@%'
where t2.jobtypeid = 2;

您不需要table3,因为您正在比较作业类型 ID,而不是名称。

您还应该修复数据模型,因此table1将 idtable2用于join,而不是比较用户名和电子邮件。


推荐阅读