MySQL - 一对多关系 - 布尔搜索

时间:2017-06-28 22:48:50

标签: mysql

我有MySQL表,看起来像这样 -

  • 候选人 - 身份证,姓名
  • 技能 - 身份证,姓名
  • CandSkills - 坦率,技巧

现在我正在尝试获取所有将“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 - 获得同时拥有JavaSalesforce
  • 的候选人
  • MySQL或PHP和Nodejs - 获得同时拥有MySQLNodejs或仅拥有PHP的候选人
  • AngularJs和Salesforce或PHP或Denodo和Java - 让所有3 AngularJsSalesforceJava或同时拥有PHPDenodo的候选人

以上带有计数方法的查询并不适用于所有情况(上面的案例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搜索不适合我。

1 个答案:

答案 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而不是内连接。