Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在mysql中匹配_Mysql_Sql - Fatal编程技术网

如何在mysql中匹配

如何在mysql中匹配,mysql,sql,Mysql,Sql,我有两个表格,一个是关于候选人及其技能的,另一个是关于工作及其所需技能的,如下所示: CSID=候选人技能ID(PK) CID=候选人ID(FK) S_代码=技能代码(FK) 这是候选人的技能表 +------------+---------+---------+ | CSID | CID | S_CODE | +------------+---------+---------+ | 1 | 1 | 5 | | 2

我有两个表格,一个是关于候选人及其技能的,另一个是关于工作及其所需技能的,如下所示:

CSID=候选人技能ID(PK)
CID=候选人ID(FK)
S_代码=技能代码(FK)

这是候选人的技能表

+------------+---------+---------+
| CSID       | CID     |  S_CODE |
+------------+---------+---------+
| 1          | 1       | 5       |
| 2          | 1       | 9       |
| 3          | 2       | 5       |
| 4          | 2       | 10      |
+------------+---------+---------+
SJID=技能工作ID(PK)
JID=作业ID(FK)
S_代码=技能代码(FK)

以下是技能工作表:

+------------+---------+---------+
| SJID       | JID     |  S_CODE |
+------------+---------+---------+
| 12         | 50      | 5       |
| 13         | 50      | 9       |
| 14         | 51      | 1       |
| 15         | 52      | 10      |
+------------+---------+---------+
因此,在本例中,工作50的唯一候选人是1,因为技能代码(S_代码)是5和9,但我也希望候选人2与52匹配,因为它具有所需的工作技能和额外的技能。 我尝试了几种方法来匹配工作和应聘者,但我失败了,下面的代码就是这种方法的一个例子:

    SELECT * , COUNT(skill_job.S_CODE) AS cnt FROM candidate_skill,
 skill_job WHERE candidate_skill.S_CODE = skill_job.S_CODE HAVING (cnt >=2)
问题是,这只会将找到的应聘者限制为一个,如果我删除COUNT子句,它会列出所有只与一项技能匹配的应聘者,因此应聘者2也将与工作50匹配

以下是phpmyadmin中表的mysql代码:

    -- phpMyAdmin SQL Dump
-- version 3.4.5
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Jul 16, 2012 at 09:27 PM
-- Server version: 5.5.16
-- PHP Version: 5.3.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `employment`
--

-- --------------------------------------------------------

--
-- Table structure for table `candidate`
--

CREATE TABLE IF NOT EXISTS `candidate` (
  `CID` int(4) NOT NULL AUTO_INCREMENT,
  `title` varchar(5) NOT NULL,
  `fname` varchar(30) NOT NULL,
  `lname` varchar(30) NOT NULL,
  `dob` date NOT NULL,
  `email` varchar(50) NOT NULL,
  `address` varchar(255) NOT NULL,
  `city` varchar(50) NOT NULL,
  `postcode` varchar(10) NOT NULL,
  `phone_num` varchar(11) NOT NULL,
  `username` varchar(40) NOT NULL,
  `password` varchar(40) NOT NULL,
  `regdate` datetime NOT NULL,
  `acc_type` enum('c','s') NOT NULL DEFAULT 'c',
  `emailactivate` enum('0','1') NOT NULL DEFAULT '0',
  `cv_name` varchar(60) NOT NULL,
  `cv` blob NOT NULL,
  PRIMARY KEY (`CID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='// this is the table for the candidates' AUTO_INCREMENT=175 ;

--
-- Dumping data for table `candidate`
--

INSERT INTO `candidate` (`CID`, `title`, `fname`, `lname`, `dob`, `email`, `address`, `city`, `postcode`, `phone_num`, `username`, `password`, `regdate`, `acc_type`, `emailactivate`, `cv_name`, `cv`) VALUES
(128, 'Mr', 'clement', 'Chilingulo', '0000-00-00', 'chlngl@yahoo.com', '28 oakfield Road', 'london', 'E6 1LW', '07771611873', 'casante', 'b59c67bf196a4758191e42f76670ceba', '0000-00-00 00:00:00', 'c', '0', '', '');
INSERT INTO `candidate` (`CID`, `title`, `fname`, `lname`, `dob`, `email`, `address`, `city`, `postcode`, `phone_num`, `username`, `password`, `regdate`, `acc_type`, `emailactivate`, `cv_name`, `cv`) VALUES
(134, 'Mr', 'rverv', 'revrb', '0000-00-00', 'tdbsdrt', 'trsbrtd', 'trbtrtrb', 'tbrfbgrts', 'trfbtrgbrfg', 'clement', 'b59c67bf196a4758191e42f76670ceba', '0000-00-00 00:00:00', 's', '0', '', '');
INSERT INTO `candidate` (`CID`, `title`, `fname`, `lname`, `dob`, `email`, `address`, `city`, `postcode`, `phone_num`, `username`, `password`, `regdate`, `acc_type`, `emailactivate`, `cv_name`, `cv`) VALUES
(165, 'Mr', 'oinInINOioni', 'ioin', '0000-00-00', 'inioimn', 'in', 'oin', 'oni', 'io', 'k', '7b8b965ad4bca0e41ab51de7b31363a1', '0000-00-00 00:00:00', 'c', '0', '', ''),
(166, 'Mr', 'pjINoNlkinoinoi', 'ino', '0000-00-00', 'oimpnponi', 'inoi', 'no', 'nj', 'nio', 'nio', 'eb5bc837d01b911029ae378e8a1c9f5d', '0000-00-00 00:00:00', 'c', '0', '', ''),
(167, 'Mr', 'vrae', 'ergvaer', '0000-00-00', 'aerbg', 'aergvera', 'aergvrea', 'aergvear', 'aergarev', 'grebvarvf', '609c1b136ec8d0d2dfdf9a2105fb605f', '0000-00-00 00:00:00', 'c', '0', '', ''),
(168, 'Mr', 'vrae', 'ergvaer', '0000-00-00', 'aerbg', 'aergvera', 'aergvrea', 'aergvear', 'aergarev', 'grebvarvf', '609c1b136ec8d0d2dfdf9a2105fb605f', '0000-00-00 00:00:00', 'c', '0', '', ''),
(169, 'Mr', 'ubp', 'bu', '0000-00-00', 'ubip', ';ub', 'ubi', 'ubo', 'buo', 'ubiipbu', '9f44ce1389a3e7372834ed730b559a5e', '0000-00-00 00:00:00', 'c', '0', '', ''),
(170, 'Mr', 'rvev', 'ferhbgetb', '0000-00-00', 'tsbtrb', 'trbstrb', 'trbsfb ', 'stb stb', 'vvfs', 'csdcdsvarewdcv', 'd41d8cd98f00b204e9800998ecf8427e', '0000-00-00 00:00:00', 'c', '0', '', ''),
(171, 'Mr', 'rvev', 'ferhbgetb', '0000-00-00', 'tsbtrb', 'trbstrb', 'trbsfb ', 'stb stb', 'vvfs', 'csdcdsvarewdcv', 'd41d8cd98f00b204e9800998ecf8427e', '0000-00-00 00:00:00', 'c', '0', '', ''),
(172, '', '', '', '0000-00-00', '', '', '', '', '', '', 'd41d8cd98f00b204e9800998ecf8427e', '0000-00-00 00:00:00', 'c', '0', '', ''),
(173, '', 'dds', 'vrv av', '0000-00-00', 'rvear', 'vreverav', 'rvedfsdv', 'frvdvf', 'fveavd', 'vdrareavdv', '84c71ac76340092398a1ed4bc7d6fe19', '0000-00-00 00:00:00', 'c', '0', '', ''),
(174, '', 'dds', 'vrv av', '0000-00-00', 'rvedwear', 'vreverav', 'rvedfsdv', 'frvdvf', 'fveavd', 'vdraredfcavdv', 'd41d8cd98f00b204e9800998ecf8427e', '0000-00-00 00:00:00', 'c', '0', '', '');

-- --------------------------------------------------------

--
-- Table structure for table `candidate_skill`
--

CREATE TABLE IF NOT EXISTS `candidate_skill` (
  `CSID` int(4) NOT NULL AUTO_INCREMENT,
  `CID` int(4) NOT NULL,
  `S_CODE` int(4) NOT NULL,
  PRIMARY KEY (`CSID`),
  KEY `CID` (`CID`),
  KEY `S_CODE` (`S_CODE`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='//match candidate and skill' AUTO_INCREMENT=131 ;

--
-- Dumping data for table `candidate_skill`
--

INSERT INTO `candidate_skill` (`CSID`, `CID`, `S_CODE`) VALUES
(114, 134, 2),
(116, 134, 9),
(121, 134, 5),
(126, 128, 1);

-- --------------------------------------------------------

--
-- Table structure for table `job`
--

CREATE TABLE IF NOT EXISTS `job` (
  `JID` int(4) NOT NULL AUTO_INCREMENT,
  `job_title` varchar(40) NOT NULL,
  `job_desc` varchar(255) NOT NULL,
  `start_date` date NOT NULL,
  `end_date` date NOT NULL,
  PRIMARY KEY (`JID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='// this is the table for the job vacancies' AUTO_INCREMENT=10 ;

--
-- Dumping data for table `job`
--

INSERT INTO `job` (`JID`, `job_title`, `job_desc`, `start_date`, `end_date`) VALUES
(1, 'engineer', ' fix engineering ish that is messed ', '0000-00-00', '0000-00-00'),
(5, 'pilot', '', '0000-00-00', '0000-00-00'),
(8, 'Charity Helper', ' ', '0000-00-00', '0000-00-00'),
(9, 'accountant', '  ', '0000-00-00', '0000-00-00');

-- --------------------------------------------------------

--
-- Table structure for table `skill`
--

CREATE TABLE IF NOT EXISTS `skill` (
  `S_CODE` int(4) NOT NULL AUTO_INCREMENT COMMENT '// this is the skill primary key',
  `skill_name` varchar(40) NOT NULL,
  `skill_desc` varchar(255) NOT NULL,
  PRIMARY KEY (`S_CODE`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

--
-- Dumping data for table `skill`
--

INSERT INTO `skill` (`S_CODE`, `skill_name`, `skill_desc`) VALUES
(1, 'speaking', 'English is your first language'),
(2, '  writing', 'You can write English very well'),
(3, ' public', ''),
(5, 'initiative', ''),
(6, 'interviewing', ''),
(7, 'negotiating', ''),
(8, 'leading', ''),
(9, '  energy', ''),
(10, ' organisation', '');

-- --------------------------------------------------------

--
-- Table structure for table `skill_job`
--

CREATE TABLE IF NOT EXISTS `skill_job` (
  `SJID` int(4) NOT NULL AUTO_INCREMENT,
  `JID` int(4) NOT NULL,
  `S_CODE` int(4) NOT NULL,
  PRIMARY KEY (`SJID`),
  KEY `S_CODE` (`S_CODE`),
  KEY `JID` (`JID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=106 ;

--
-- Dumping data for table `skill_job`
--

INSERT INTO `skill_job` (`SJID`, `JID`, `S_CODE`) VALUES
(91, 5, 2),
(94, 5, 5),
(95, 5, 9),
(98, 1, 1),
(102, 1, 8),
(105, 8, 8);

--
-- Constraints for dumped tables
--

--
-- Constraints for table `candidate_skill`
--
ALTER TABLE `candidate_skill`
  ADD CONSTRAINT `candidate_skill_ibfk_3` FOREIGN KEY (`CID`) REFERENCES `candidate` (`CID`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `candidate_skill_ibfk_4` FOREIGN KEY (`S_CODE`) REFERENCES `skill` (`S_CODE`) ON DELETE CASCADE ON UPDATE CASCADE;

--
-- Constraints for table `skill_job`
--
ALTER TABLE `skill_job`
  ADD CONSTRAINT `skill_job_ibfk_4` FOREIGN KEY (`JID`) REFERENCES `job` (`JID`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `skill_job_ibfk_5` FOREIGN KEY (`S_CODE`) REFERENCES `skill` (`S_CODE`) ON DELETE CASCADE ON UPDATE CASCADE;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

您似乎需要使用组合表来组合两个表,然后比较它们的行值。

应该是这样的

SELECT
   CID
FROM 
   candidate_skill
WHERE
   S_CODE IN (
               SELECT S_CODE FROM skill_jobs where JID = 52 
             )
GROUP BY CID
更正:以前的查询将无法匹配所有必需的S_代码

SELECT
   CID, COUNT(CSID) as cnt
FROM 
   candidate_skill
INNER JOIN skill_jobs 
WHERE
   S_CODE IN (
               SELECT S_CODE FROM skill_jobs where JID = 52 
             )
GROUP BY CID 
HAVING cnt = (
               SELECT count(*) from skill_jobs where JID = 52
             )

双重否定是你的朋友(尽管我不太了解MySQL,不知道它是否支持它):


“人工翻译”的意思是,不应该存在应聘者不具备的工作所需的任何技能。

你将需要更复杂的加入,我认为没有简单的方法可以同时回答你的请求和显而易见的“应聘者X与工作Y的匹配情况如何?”以及“候选人X适合工作Y的比例是多少?”

不管怎么说,我来了

SELECT candidate_skill.CID, skill_job.JID, COUNT(*) AS has, sjtot.needed
    FROM skill_job JOIN candidate_skill ON (candidate_skill.S_CODE = skill_job.S_CODE)
    LEFT JOIN ( SELECT JID, COUNT(*) AS needed FROM skill_job GROUP BY JID ) AS sjtot
        ON ( skill_job.JID = sjtot.JID )
GROUP BY CID, JID
HAVING has >= needed;
在实践中,我首先将所需的技能分组到skill_job上,这告诉我job 50需要两种技能

有了这些,我留下了加入所需技能和候选人技能;有些候选人会加入所有技能,有些则不会。然后只需计算有多少人匹配即可

+------+------+-----+--------+
| CID  | JID  | has | needed |
+------+------+-----+--------+
|    1 |   50 |   2 |      2 |
|    2 |   52 |   1 |      1 |
+------+------+-----+--------+
仔细考虑后,可能会选择所需技能级别和提供的技能级别,并在用于提取匹配时使用CASE(如果提供1>=所需,则为提供/所需)。然后,结果值的平均值可能会用作“技能匹配”索引

至于“X与Y的匹配情况如何?”问题,一旦您知道候选人CID 1适合工作JID 50,您就可以在候选人和工作之间运行左联接。您已经知道,无论工作要求什么,候选人都有,但通过这种方式,您可以检索候选人所拥有的未分配技能以及其他相关值


将上面的查询和最后一个查询连接起来的嵌套查询可能会一次性告诉您所有信息,但这将是一个代价高昂的突飞猛进,我认为:-)

如果您不关心跨dbms的支持,您可以使用mysql特定的组concat将两个s_代码集缩减为字符串,每个候选人/作业一个,然后像这样比较它们:

select * from 
(select cs.cid, group_concat(cs.s_code order by cs.s_code) skills 
    from candidate_skill cs group by cs.cid) cs, 
(select sj.jid, group_concat(sj.s_code order by sj.s_code) skills 
    from skill_job sj group by sj.jid) sj
where sj.skills = cs.skills

请注意,当您的表增长到最终where时,速度将越来越慢,并且您无法在组_concat()上创建索引已创建字段。

CSID、CID、S_代码、SJID和JID代表什么并不十分明显。在第一个表中,最后一行的“CSID”是3,是否准确?也不了解列。你能粘贴一个充满insert查询的SQL脚本,这样我们就可以在不眯着眼睛的情况下感受这些表吗?@OccessiveFoss我将从m my db,它包含5个表。您可以包含insert语句吗?使用MySQL workbench或PHPmyAdmin之类的工具它可以为您做到这一点,
来自候选者技能,技能工作
与内部联接相同。@AndriusNaruševičius:是的。“内部联接和,(逗号)在没有联接条件的情况下在语义上是等价的。”“博士:@火箭真有趣,我不知道!谢谢你的提醒。这完全是不可能的:)与内在的你一起做某事。使用逗号时,不需要提供您要加入的内容,因此您可以得到Decart矩阵。试着用INNER获取Decart的矩阵。@AndriusNaruševičius:当使用逗号时,需要在WHERE中添加连接条件
从a,b中选择a,b,其中a.id=b.id
您可能不太了解MySQL,但我向您保证,您非常棒,代码工作得非常好耶,这是一项巨大的努力,Set:)
select * from 
(select cs.cid, group_concat(cs.s_code order by cs.s_code) skills 
    from candidate_skill cs group by cs.cid) cs, 
(select sj.jid, group_concat(sj.s_code order by sj.s_code) skills 
    from skill_job sj group by sj.jid) sj
where sj.skills = cs.skills