MYSQL加入和排序

时间:2015-10-25 22:26:35

标签: php mysql

我正在创建搜索,其中包括关键字和位置/半径选项。 我有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

0 个答案:

没有答案