【问题标题】:How to combine a Distance and Keyword SQL query?如何结合距离和关键字 SQL 查询?
【发布时间】:2011-02-13 04:07:33
【问题描述】:

我的数据库中有一个名为“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”短语,那么它会起作用,但我仍然不确定这是否会给我想要的结果。我还尝试了另一种方式的查询,首先是距离搜索,但这似乎忽略了我的关键字。

任何想法将不胜感激!

【问题讨论】:

    标签: php mysql database search


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        谢谢各位。我能够使用此查询使其工作:

        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
        

        谢谢!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-26
          • 1970-01-01
          • 2022-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-11
          相关资源
          最近更新 更多