我有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代码传递查询的技能部分,连接字符串,并在每次用户搜索特定技能的候选人时生成新查询。
答案 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.sid
和candskills.sid
上添加另一个索引可能会进一步改进查询。