MySQL-我的加入有问题吗
我对这件事困惑了一段时间 基本上这是我的声明MySQL-我的加入有问题吗,mysql,sql,Mysql,Sql,我对这件事困惑了一段时间 基本上这是我的声明 SELECT CandidateID, Town, Candidates.SalaryMin, CandidateExperience, CandidateExperience.divTagExp, PrimarySector, Candidates.SalaryMin, CandidateSalary.divTagSal, CASE WHEN following.RecID =1 THEN 'block' ELSE 'none' END AS
SELECT CandidateID, Town, Candidates.SalaryMin, CandidateExperience, CandidateExperience.divTagExp, PrimarySector, Candidates.SalaryMin, CandidateSalary.divTagSal,
CASE WHEN following.RecID =1
THEN 'block'
ELSE 'none'
END AS divFollow
FROM Candidates
LEFT JOIN CandidateExperience ON CandidateExperience.CandidateExpID = Candidates.CandidateExperience
LEFT JOIN CandidateSalary ON Candidates.SalaryMin >= CandidateSalary.SalaryMin
LEFT JOIN following ON following.RecID = Candidates.CandidateID
AND Candidates.SalaryMin <= CandidateSalary.SalaryMax
选择CandidateID、Town、Candidates.SalaryMin、CandidateExperience、CandidateExperience.divTagExp、PrimarySector、Candidates.SalaryMin、CandidateSalary.divTagSal、,
以下情况下的情况。RecID=1
然后“阻止”
“没有”
结束如下
来自候选人
LEFT JOIN CandidateExperience ON CandidateExperience.CandidateExpID=Candidates.CandidateExperience
LEFT JOIN CandidateSalary ON Candidates.SalaryMin>=CandidateSalary.SalaryMin
following.RecID=Candidates.CandidateID上的左连接following
SalaryMin我发现两个问题:
以下联接条件:
LEFT JOIN following ON following.RecID = Candidates.CandidateID
应该是:
LEFT JOIN following ON following.FollowID= Candidates.CandidateID
此外:
和Candidates.SalaryMin=CandidateSalary.SalaryMin和Candidates.SalaryMin您加入的是following ON following.RecID=Candidates.CandidateID
-我想您想要的是更像following ON following.followID=Candidates.CandidateID
此外,如果不需要divTagSal,可以使用groupby
将它们放在一起
SELECT *,
CASE
WHEN candidateId IN
(
SELECT followId
FROM following
)
THEN
'block'
ELSE
'none'
END AS divFollow
FROM Candidates
可以进行进一步的内部联接以从下表中获取数据
左外部联接确保前一个表中的所有条目(联接运算符的左侧)至少在结果表中一个。如果后一个表(联接运算符的右侧)中没有对应项,则来自后一个表的单元格将填充NULL。这为您完成了任务,因为您希望每个候选人在follow中都有一个对应项,以便在divFollow上获得一个“block”,否则为“none”值。啊,是的,这是一个问题。修正了此问题,但仍将获得多条记录,将上载新结果。和Candidates.SalaryMin如果希望每个候选人都有一行,则需要排除薪资,或将其聚合。。你有倍数,因为Bill Bridge在工资表中有多个条目。很遗憾,我需要divTagSal。如果你能发布一些来自CandidateExperience和CandidateSalary的记录,那将很有帮助。据我所知,这就是造成问题的原因(候选名单)。不用那个连接就试试吧。那些连接很好。就在添加以下连接时,它开始发送多个结果。对不起,我应该说得更清楚些,这已经做到了。我尽量避免使用子查询,但目前我想不出其他解决方法。谢谢。@Mcam435:有一种方法可以使用左连接/is NULL
,但子查询并没有什么不好的地方
LEFT JOIN CandidateSalary ON Candidates.SalaryMin >= CandidateSalary.SalaryMin AND Candidates.SalaryMin <= CandidateSalary.SalaryMax
SELECT *,
CASE
WHEN candidateId IN
(
SELECT followId
FROM following
)
THEN
'block'
ELSE
'none'
END AS divFollow
FROM Candidates
select Candidates.*, ISNULL(Following.divFollow, 'none') as divFollow
from Candidates left join (select distinct followID from Following) as Following
on CandidateID = followID