无法从查询中获取结果

时间:2018-09-19 08:13:46

标签: php mysql

我正在尝试查找具有与期望值相匹配的技能的提供商(在本例中为“交付管理”)。

查询1:要获取技能ID,请使用以下查询

SELECT * FROM tbl_skills WHERE skill_name LIKE '%Delivery Management%'

返回两个ID 202,395 技能ID = 202,395

查询2:搜索具有匹配技能的用户列表

SELECT *, (6371 * acos (
        cos ( radians('28.4594965') )
        * cos( radians( latitude ) )
        * cos( radians( longitude ) - radians('77.0266383') )
        + sin ( radians('28.4594965') )
        * sin( radians( latitude )
))) AS distance
FROM tbl_serviceprovider
WHERE skills IN(202,395)
ORDER BY distance;

但是它没有返回结果。在tbl_serviceprovider表中,技能以逗号分隔的列表形式存储,例如1,2,3

提供商表结构

CREATE TABLE IF NOT EXISTS `tbl_serviceprovider` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `userId` int(11) NOT NULL,
  `gender` varchar(300) NOT NULL,
  `profession` varchar(100) NOT NULL,
  `dob` varchar(100) NOT NULL,
  `mobile` varchar(100) NOT NULL,
  `address` varchar(400) NOT NULL,
  `latitude` varchar(200) NOT NULL,
  `longitude` varchar(200) NOT NULL,
  `city` varchar(100) NOT NULL,
  `state` varchar(100) NOT NULL,
  `country` varchar(100) NOT NULL,
  `email` varchar(100) NOT NULL,
  `profile_pic` varchar(100) NOT NULL,
  `attachedDocument` varchar(300) NOT NULL,
  `education` text NOT NULL,
  `otherEducation` text NOT NULL,
  `aadharNumber` varchar(250) NOT NULL,
  `skills` varchar(250) NOT NULL,
  `briefDescription` text NOT NULL,
  `userAvailable` enum('0','1') NOT NULL DEFAULT '0',
  `timeFrom` varchar(200) NOT NULL,
  `timeTo` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
)
(108, 'Amit Kaushik', 111, 'Male', '', '11/11/1971', '1234567890', 'Sector-85, Gurgaon', '28.404634', '76.950958', '', 'Haryana', '', 'demo@gmailx.com', 'profile20171123125011.png', 'document20171123125011.png', 'Upto 12th Class', 'B.Tech. MBA', '', '394,395,396,203', 'Expertise in program management.', '1', '09:00:00', '08:00 PM'),

tbl_skills表结构

CREATE TABLE IF NOT EXISTS `tbl_skills` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `skill_name` varchar(100) NOT NULL,
  `user` int(11) NOT NULL,
  PRIMARY KEY (`id`)
)
INSERT INTO `tbl_skills` (`id`, `skill_name`, `user`) VALUES
(202, 'Project Management, Delivery Management,Release', 111)

1 个答案:

答案 0 :(得分:1)

您可以按以下方式在CSV字符串中分别搜索数字:

SELECT *, (6371 * acos (
        cos ( radians('28.4594965') )
        * cos( radians( latitude ) )
        * cos( radians( longitude ) - radians('77.0266383') )
        + sin ( radians('28.4594965') )
        * sin( radians( latitude )
))) AS distance
FROM tbl_serviceprovider
WHERE LOCATE(',202,', CONCAT(',', skills, ','))
    OR LOCATE(',395,', CONCAT(',', skills, ','))
ORDER BY distance;

通过用逗号将两个值括起来并使用LOCATE,将确保找到实际值。这需要将每个OR的where子句组合在一起,因为每个skill_id都需要搜索它自己的子句。它不是那么优雅,但是很简单并且可以使用。

我也回应其他人的观点,即应该将其标准化,将技能的CSV存储在字符串中并不是最佳解决方案。