MySQL根据条件多次加入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL根据条件多次加入相关的知识,希望对你有一定的参考价值。

我有3张桌子..说。

  1. users(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 case一样

我在寻找的是那个

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

以上是关于MySQL根据条件多次加入的主要内容,如果未能解决你的问题,请参考以下文章

使用 Criteria API 根据条件计算加入表的结果

GraphQL 查询,根据某些条件使用片段。已加载 GraphQL 文件

在后台堆栈中多次防止相同的片段

Mybatis -- 动态Sql概述动态Sql之<if>(包含<where>)动态Sql之<foreach>sql片段抽取

根据条件加入mongodb集合[重复]

mysql加入条件