当一个表ID存在于另一表的多列中时,如何编写SQL JOIN查询以获得结果

时间:2019-01-22 10:00:30

标签: sql

我有两个表“ users”和“ jobs”。根据该数据库设计,“用户”和“工作”表如下所示:

表名:用户

id | first_name | last_name  
1  | John       | Smith  
2  | Lee        | Smith  
3  | Max        | Smith

表名:工作

id | job_name | assign_to_1 | assign_to_2 | assign_to_3
1  | Plumbing | 1           |   2         | 3

我想获得所有具有分配名称的工作,我这样写查询,

SELECT 
jobs.job_name,
jobs.assign_to_1,
jobs.assign_to_2,
jobs.assign_to_3
FROM jobs
JOIN users ON users.id IN (jobs.assign_to_1,jobs.assign_to_2, jobs.assign_to_3)

请有人说明如何获取Assign_to_1用户名,assign_to_2用户名,

分配用户名而不是用户ID。

3 个答案:

答案 0 :(得分:3)

使用多个联接和别名

此代码应该有效:

select j.job_name, u1.name as emp1, u2.name as em2, u3.name as emp3 
         from jobs j join users as u1 on j.assign_to_1=u1.id 
                     join users as u2 on j.assign_to_2=u2.id 
                     join users as u3 on j.assign_to_3=u3.id

我假设您只需要工作名称和每个员工的名字(如果需要姓氏,则编辑很容易)

无论如何,我建议您重新设计表格,因为在当前配置下,您最多可以拥有3个emp,将来您必须更改表格以将新emp添加到同一工作中。

我会喜欢这种(关系符号)

EMP(first_name, last_name, emp_id)
job(name, job_id) 
work(emp_id,job_id) fk job_id ref. job, emp_id ref. emp

通过这种安排,您可以为每个工作添加任意数量的工人,而且由于只有2个联接,查询也很便宜

答案 1 :(得分:1)

我将执行以下操作:

表名:用户

id | first_name | last_name  
1  | John       | Smith  
2  | Lee        | Smith  
3  | Max        | Smith

表名:工作

id | job_name 
1  | Plumbing 

表名:job_users

job_id | user_id | priority
1      | 1       | 1 
1      | 2       | 2
1      | 3       | 3

然后像这样查询它:

SELECT
  jobs.id, job_name, concat(first_name, ' ', last_name) AS assignee, priority 
FROM
  (jobs LEFT JOIN job_users on jobs.id = job_id) INNER JOIN users ON user_id = users.id 

答案 2 :(得分:1)

根据您的要求更改“ assign_to_1_user,assign_to_2_user,assign_to_3_user” 名称。 将用户表的不同联接与不同的别名一起使用。

SELECT 
    jb.job_name,
    CONCAT(user1.first_name, ' ', user1.last_name) AS assign_to_1_user,
    CONCAT(user2.first_name, ' ', user2.last_name) AS assign_to_2_user,
    CONCAT(user3.first_name, ' ', user3.last_name) AS assign_to_3_user
    FROM jobs as jb
    INNER JOIN users user1 ON user1.id = jb.assign_to_1
    INNER JOIN users user2 ON user2.id = jb.assign_to_2
    INNER JOIN users user3 ON user3.id = jb.assign_to_3