我正在创建搜索,其中包括关键字和位置/半径选项。 我有1个表,其中包含作业的位置(经度和纬度)信息(作业可以有多个位置)。 我有另一张表,其中包含作业的所有其他信息,如标题。
table jobs:
+----------+---------+
| jobref | title |
+----------+---------+
table jobs_locations:
+----------+------------+-------------+
| jobref | latitude | longitude |
+----------+------------+-------------+
当用户输入位置时,我会生成纬度和经度 然后,我可以获得来自&jobs; jobs_locations'使用这样的选择在该位置的半径范围内:
"SELECT DISTINCT jobref,
( 3959 * acos( cos( radians(".$lat.") ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(".$lon.") ) + sin( radians(".$lat.") ) * sin( radians( latitude ) ) ) )
AS distance
FROM jobs_locations
HAVING distance < ".$distance;
我也搜索主要的工作&#39;用于标题与用户输入关键字匹配的作业的表:
"SELECT *,
MATCH(`title`)
AGAINST ('".$keywords."*' IN BOOLEAN MODE)
AS Relevance
FROM jobs
WHERE MATCH(`title`)
AGAINST ('".$keywords."*' IN BOOLEAN MODE)";
我的问题是,如何将这两个查询连接在一起,以获得与关键字和位置/半径输入相匹配的作业,然后按ORDER BY距离(或相关性,如果用户需要)?
修改::
到目前为止,我已经尝试了这个..它没有用 - 它花了FOREVER和mysql服务器刚刚离开。什么是更好,更快的方式呢?
SELECT *,
MATCH(jobs.title)
AGAINST ('developer*' IN BOOLEAN MODE)
AS Relevance,
( 3959 * acos( cos( radians(51.27) ) * cos( radians( jobs_locations.latitude ) ) * cos( radians( jobs_locations.longitude ) - radians(-0.83) ) + sin( radians(51.27) ) * sin( radians( jobs_locations.latitude ) ) ) )
AS distance
FROM jobs
INNER JOIN jobs_locations ON jobs.jobref = jobs_locations.jobref
WHERE MATCH(jobs.title)
AGAINST ('developer*' IN BOOLEAN MODE)
AND jobs.salary_per = 'annum'
HAVING distance < 15
ORDER BY Relevance DESC LIMIT 0,10