我的数据库中有一个名为“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”短语然后它可以工作,但我仍然不确定这是否给了我想要的结果。我还首先使用距离搜索尝试了查询,但这似乎忽略了我的关键字。
任何想法都会非常感激!
答案 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
谢谢!