MySQL使用连接进行搜索

时间:2017-02-09 19:33:34

标签: php mysql

我有2个mysql表 -

candskill - (cis,sid) - 其中cid =候选人ID,sid =技能ID

candskill中的数据(大小 - 257,000) -

c1, s1
c1, s2
c2, s3
c1, s4
c2, s5
...

技能 - (sid,name) - 其中sid =技能ID,名称=技能名称

技能数据(大小257,000) -

s1 - oracle
s2 - project management
s3 - oracle
s4 - testing
s5 - testing
...

现在,我想要获取所有具有技能'oracle'和'测试'的候选人。或者我想要有“oracle”或“测试”技能的候选人。我希望有任何技能的AND / OR组合,并希望获得这些技能的候选人。

我将如何实现这一目标?

这是我到目前为止所做的,但并非在所有情况下都有效。

select distinct(cs.cid), s.name from candskill cs 
inner join skills s on (cs.sid = s.sid and (s.name = 'oracle' or s.name = 'testing'))

此外,查询执行花费了太多时间。大约120秒。我们该怎么做呢。

我正在考虑编写一个查询,并通过php代码传递查询的技能部分,连接字符串,并在每次用户搜索特定技能的候选人时生成新查询。

2 个答案:

答案 0 :(得分:1)

您可以在s.name

的计数中使用having子句
  select cs.cid
  from candskill cs 
  inner join skills s on (cs.sid = s.sid and  s.name in (  'oracle' , 'testing'))
  group by cs.cid
  having count(distinct(s.name)) = 2

为1或2

  select cs.cid
  from candskill cs 
  inner join skills s on (cs.sid = s.sid and  s.name in (  'oracle' , 'testing'))
  group by cs.cid
  having count(distinct(s.name)) >= 1

答案 1 :(得分:1)

也许减少技能组合有助于提升表现,例如

select cs.cid
from (select sid from skills where name in ('oracle', 'testing')) s
join candskills cs on cs.sid = s.sid

不是加入250,000 x 250,000行,而是加入2 x 250,000行。

此外,在skills.name上添加索引,在skills.sidcandskills.sid上添加另一个索引可能会进一步改进查询。