我有MySQL表,看起来像这样 -
现在我正在尝试获取所有将“Java”作为技能并将“Salesforce”作为技能的候选人。在这种情况下,以下查询运作良好 -
select cs.candid from CandSkills cs inner join Skills s on (cs.skillid = s.id)
group by cs.candid where s.name in ('Java', 'Salesforce')
having count(s.name) = 2
现在的问题是,搜索技能是由用户通过ajax调用从Web UI提供的。所以它可以是任何组合或“和”/“或”。例如,用户可以搜索具有技能的候选人 -
Java
和Salesforce
MySQL
和Nodejs
或仅拥有PHP
的候选人AngularJs
,Salesforce
和Java
或同时拥有PHP
和Denodo
的候选人以上带有计数方法的查询并不适用于所有情况(上面的案例2,3) -
select cs.candid from CandSkills cs inner join Skills s on (cs.skillid = s.id)
group by cs.candid where s.name in ('MySQL', 'Nodejs', 'PHP')
having count(s.name) = 2
这可能会让那些拥有MySQL和PHP但没有Nodejs的候选人回归。
非常感谢任何帮助。如果问题不明确,请告诉我。
PS - MySQL版本是5.4,所以在布尔模式下的FULLTEXT搜索不适合我。
答案 0 :(得分:1)
我必须这样做一次,我能够做到的唯一方法(没有Oracle SQL)是这样的。我不确定它的性能,但我认为sql引擎可以对此进行一些重要的优化,因此它可能表现良好。
*警告要注意它是一种癌症。
select cs.candid
from CandSkills cs
inner join Skills s1 on (cs.skillid = s1.id AND s1.name = 'MySQL' )
inner join Skills s2 on (cs.skillid = s1.id AND s1.name = 'Nodejs' )
inner join Skills s3 on (cs.skillid = s1.id AND s1.name = 'PHP' )
您也可以使用exists而不是内连接。