2010-04-28 47 views
1

我在我的数据库中有一个名为“points”和“category”的表格。用户将输入信息到位置输入和关键字输入文本框中。如何结合距离和关键字SQL查询?

然后我想在我的表格中找到关键字与点表中的“标题”字段相匹配的点或“类别”但位于距用户位置一定距离内的点。我想按距离排序结果。

这里有2个查询其独立BTOH工作:

$mysql = "SELECT *, (3959 * acos(cos(radians('$search_lat')) * cos(radians(lat)) * cos(radians(longi) - radians('$search_lng')) + sin(radians('$search_lat')) * sin(radians(lat)))) AS distance FROM points HAVING distance < '$radius'"; 

$mysql2 = "SELECT * FROM `points` LEFT JOIN category USING (category_id) WHERE (point_title LIKE '%$esc_catsearch%' OR category.title LIKE '%$esc_catsearch%')"; 

这里是我的尝试:

$sql_search = sprintf("SELECT *,point_id FROM points WHERE point_title LIKE '%%%s%%' UNION SELECT *, (3959 * acos(cos(radians('%s')) * cos(radians(lat)) * cos(radians(longi) - radians('%s')) + sin(radians('%s')) * sin(radians(lat)))) AS distance FROM points HAVING distance < '%s' ORDER BY distance LIMIT %d , %d", 

$esc_catsearch, 
mysql_real_escape_string($search_lat), 

mysql_real_escape_string($search_lng), 

mysql_real_escape_string($search_lat), 

mysql_real_escape_string($radius), 

$offset, 

$rowsPerPage); 

但它告诉我没有已知列 “距离”。如果我删除了“顺序依据”一词,那么它可以工作,但我仍然不确定这是否给了我想要的结果。我也试着用距离搜索的其他方式尝试查询,但似乎忽略了我的关键字。

任何想法将不胜感激!

回答

0

也许不是使用联合,您可以将距离查询作为子查询运行,然后从该查询中选择SELECT(将其视为临时表)以获得与关键字搜索匹配的结果?从本质上说,一般形式的东西...

SELECT * FROM (SELECT * FROM ... WHERE distance < X) as distResults WHERE .... 

或潜在的其他方式 - 首先运行关键词搜索,然后把这些结果,并利用它们来跑的距离搜索。无论哪种方式将消除最多的计算开销。

0

我认为你需要有列别名在你的工会第一部分:

$sql_search = sprintf("SELECT *,point_id as distance FROM... 
0

谢谢你们。我能够使用这个查询得到它的工作:

SELECT *,point_id FROM (SELECT *, (3959 * acos(cos(radians('37.7749295')) * cos(radians(lat)) * cos(radians(longi) - radians('-122.4194155')) + sin(radians('37.7749295')) * sin(radians(lat)))) AS distance FROM points HAVING distance < '25') as distResults LEFT JOIN category USING (category_id) WHERE (point_title LIKE '%test%' OR category.title LIKE '%test%') ORDER BY distance LIMIT 0 , 10 

谢谢!