[英]MySQL multiple join based on conditions
我有3张桌子..说。
(id,name,role_id(FK to roles)
(id,name,user_id(FK to users)
(id,name)
(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:staff
和role_id=5 student
类似于C编程中的切换大小写
我在寻找的是
switch(role_id){ case 3: JOIN with students table;return;case 5:JOIN with staff table;return;}
您可以在职员和学生的联接中使用这些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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.