【问题标题】:MySQL multiple join based on conditionsMySQL基于条件的多重连接
【发布时间】:2023-04-01 05:05:01
【问题描述】:

我有 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 case


我要找的是那个

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

【问题讨论】:

  • 更新您的问题添加适当的数据样本和预期结果
  • 我相信这个问题大家都很清楚
  • 如果只有员工或学生匹配,则在 SELECT 中使用 COALESCE。

标签: mysql sql node.js database


【解决方案1】:

您可以在教职员工和学生的联接中使用这些角色 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

【讨论】:

  • 它正在工作,但在我的查询中显示 student_name=NULL
  • 用户可以同时是学生和员工吗?或者它的 role_id 可能与 3 或 5 不同?
  • no..这里有一个用户是学生或员工。是的,还有其他角色,而不是这 3 和 5
  • 如果您运行第二个查询,该用户有什么 role_id?
  • 他的roleid是3,它会返回结果,但它也显示了不需要的学生姓名
猜你喜欢
  • 2021-02-22
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 2011-10-07
相关资源
最近更新 更多