我正在尝试查找具有与期望值相匹配的技能的提供商(在本例中为“交付管理”)。
查询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)
答案 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存储在字符串中并不是最佳解决方案。