MySQL Join 错误结果
Posted
技术标签:
【中文标题】MySQL Join 错误结果【英文标题】:MySQL Join Wrong Result 【发布时间】:2015-08-15 14:02:42 【问题描述】:我有 3 个表,名称、主管和经理。我需要一个显示姓名列表的查询,以及他们是主管、经理还是两者兼而有之。
我当前的查询完成了 90% 的问题,返回所有主管,并检查他们是否也是经理。但是,如果用户不是“主管”而是“经理”,则他不会在查询中列出。
SELECT name.id,
name.email,
IF(sup.code = 1, 'Yes', 'No') as Supervisor,
IF(man.userId IS NOT NULL, 'Yes', 'No') as Manager
FROM employee name
LEFT JOIN supervisor sup ON name.id = sup.id
LEFT JOIN manager man ON name.id = man.id
WHERE sup.code = 1
谢谢
【问题讨论】:
您将加入表supervisor
,因此推测如果某人不是主管,他们在supervisor
中没有记录。在那种情况下,sup.code
不会是 1
您是否尝试过将WHERE
子句排除在外?
【参考方案1】:
您的问题是where
子句。通过包含它,您将结果限制为仅包含具有该值集的结果。显然,对于那些不是主管的人来说,这不会是真的。
这会破坏您加入的outernish
。要在不破坏该功能的情况下对左连接添加附加条件,您需要将条件移至 on
子句。在这种情况下,您似乎也可以完全删除 where
子句,除非每个员工的主管表中可能有多个条目。
不管怎样,你的两个选择是:
SELECT name.id,
name.email,
IF(sup.code = 1, 'Yes', 'No') as Supervisor,
IF(man.userId IS NOT NULL, 'Yes', 'No') as Manager
FROM employee name
LEFT JOIN supervisor sup ON name.id = sup.id
LEFT JOIN manager man ON name.id = man.id
还有:
SELECT name.id,
name.email,
IF(sup.code = 1, 'Yes', 'No') as Supervisor,
IF(man.userId IS NOT NULL, 'Yes', 'No') as Manager
FROM employee name
LEFT JOIN supervisor sup ON name.id = sup.id AND sup.code = 1
LEFT JOIN manager man ON name.id = man.id
【讨论】:
谢谢@pala_ 我修改了您的答案(将 AND 条件添加到 Join)并维护 WHERE 子句,这样我就可以过滤掉 sup 和 manager 都为“否”的记录,这我没兴趣看。以上是关于MySQL Join 错误结果的主要内容,如果未能解决你的问题,请参考以下文章