MySQL根据条件进行多次连接

时间:2019-01-14 10:19:20

标签: mysql sql node.js database

我有3张桌子。 说。

  1. 用户(id,name,role_id(FK to roles)
  2. 工作人员(id,name,user_id(FK to users)
  3. 角色(id,name)
  4. 学生(id,name,user_id(FK to users)

我需要如下结果:
  当用户是学生时(roleid = 5),我需要与学生表合并并获取学生详细信息。或当用户是人员(role_id = 3)时,我只需要从人员表和显示中获取详细信息。怎么可能。 我编写了一个查询,该查询保留了2个表的联接,但显示了这种情况下不参与的其他表。

我在这里分享我遇到的事情

    select * 
      from users u 
     JOIN roles r on u.role_id=r.id 
left join staff st on st.user_id=u.id 
left join students s on s.user_id=u.id 
    where u.id=11068

role_id=3:staffrole_id=5 student类似于C编程中的切换大小写


我要找的是那个

switch(role_id){ case 3: JOIN with students table;return;case 5:JOIN with staff table;return;}

1 个答案:

答案 0 :(得分:2)

您可以在职员和学生的联接中使用这些role_id。

由于职员名称或学生的姓名将为空,因此您可以使用COALESCE仅获得1个姓名。

select 
 u.name as user_name, 
 u.role_id,
 r.name as role_name,
 COALESCE(sta.name, stu.name) AS name
FROM users u 
LEFT JOIN roles r ON r.id = u.role_id
LEFT JOIN staff sta ON (sta.user_id = u.id AND u.role_id = 3)
LEFT JOIN students stu ON (stu.user_id = u.id AND u.role_id = 5)
WHERE u.id = 11068

但是我不认为联接中的那些额外规则是必需的。

我想如果有人在“学生”里,你可以说他是学生。
还有一个员工在“职员”中。
不管role_id。

在SQL中,您还可以将CASE用作开关。

select 
 u.name as user_name, 
 u.role_id,
 r.name as role_name,
 (CASE u.role_id
  WHEN 3 THEN sta.name
  WHEN 5 THEN stu.name
  END) AS name
FROM users u 
LEFT JOIN roles r ON r.id = u.role_id
LEFT JOIN staff sta ON sta.user_id = u.id
LEFT JOIN students stu ON stu.user_id = u.id
WHERE u.id = 11068