如何组合距离和关键字SQL查询?

时间:2010-04-28 03:16:30

标签: php mysql database search

我的数据库中有一个名为“points”和“category”的表。用户将信息输入到位置输入和关键字输入文本框中。

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

以下是btoh独立工作的2个查询:

$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);

但它告诉我没有知道列“距离”。如果我删除“Order By”短语然后它可以工作,但我仍然不确定这是否给了我想要的结果。我还首先使用距离搜索尝试了查询,但这似乎忽略了我的关键字。

任何想法都会非常感激!

3 个答案:

答案 0 :(得分:0)

也许不是使用联合,而是可以将距离查询作为子查询运行,然后从中进行SELECT(将其视为临时表)以获得与关键字搜索匹配的那些?从本质上讲,这是一般形式......

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

或者可能反过来 - 首先运行关键字搜索,然后获取这些结果并使用它们来运行距离搜索。无论哪种方式都可以消除最多的计算开销。

答案 1 :(得分:0)

我认为您需要在联盟的第一部分中包含列别名:

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

答案 2 :(得分: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

谢谢!