问题是这样的,一张职位表和一张简历表,两个没有可关联字段,按照简历表中个人的行业类型、工作类型、城市和薪资关联职位表,取职位表中与简历表四项信息吻合(行业类型相同,工作类型相同,城市相同,薪资大于职位最低薪资),提取简历ID和职位ID,并按职位最高薪资排序,如果匹配出3个以上jobID,则只取前三位。
求助各位大神,应该怎么实现这个逻辑,我已经用sql实现了,但效率太低,线上负载很大,有没有其他的方法能实现。
如果是类似于51job这样的简历与职位,则不建议SQL语句直接搞完,而是应该编程实现。
因为那样的简历、职位搜索条件太复杂了,而且不是简单的“等于”关系;并且需求还可能发生变化。
先select 职位表,注意 where的条件,注意表的索引问题即可。
再针对每条记录select 简历表,注意 where的条件,sort的条件,注意表的索引问题。使用游标,搜到了3条即终止。
select a.*,b.* from a,b where a.username=b.username and a.username='admin'
不要重复的那就用 union
union all 是所有的都差出来
select * from a where username='admin'
union
select * from b where username='admin';
不一定要一条sql写出来,可以写多条sql查。。
可以把你的sql发出来,让大家看看有没有可以改进的地方,数据量是多大也可以顺便说一下
四个条件取三个排列组合组合成查询语句,结果再联合。再去top 3
sql语句发出来 才能给你优化
试试组合主键,或者创建索引
通过视图来让两个表联系起来就可以了
可以写一个存储过程,把你需要的数据写在过程里试试
或者可以考虑使用程序来处理。把数据提取出内存,通过以后台任务这样的形式用程序来进行批处理,这样可一定程度缓解线上数据库负担过重的问题
SELECT * , ROW _ NUMBER() OVER(PARTITION BY A.简历ID ORDER BY B.最高薪资) as Sequence FROM A
LEFT JOIN B ON 行业类型相同,工作类型相同,城市相同,A.薪资>B.职位最低薪资
然后再取出Sequence < 4 的记录即可。