mysql - 在寻找饮料时找到最近的酒吧

标签 mysql sql query-optimization geospatial spatial-index

问题:找到最近的供应我要找的饮料的酒吧。

在这里你可以找到生成的MySQL代码http://pastebin.com/5Uc2ewUW

与这个问题交互的API Request会有这些参数

query, String, ideally the drink name 
lng, double, the starting longitude
lat, double, the starting latitude
range, integer, max distance in meters (with a default value)

查询参数可能会选择不止一种饮料(考虑搜索“Vodka”)。

编写性能良好的 SQL 查询的好策略是什么?

我不是很专业,但是我的想法是

  • 选择范围内的柱
  • SELECT from drink__bars where bar_id is in the previous select result
  • 加入酒水表获取酒水数据

如何根据距离设置顺序?

欢迎任何建议!

编辑:感谢到目前为止的回答,但他们主要集中在计算距离并且涵盖了这些内容。 我不知道如何根据我与酒吧的距离来订购结果(即饮料)。

像这个元查询一样思考

SELECT drink.id, drink.name 
FROM $DATA_POOL
WHERE drink.name LIKE '%MY_QUERY%' 
ORDER BY $ORDER

在哪里

  • $DATA_POOL = 饮料的子集,是我附近酒吧的服务员(我已经可以计算出我附近有哪些酒吧)
  • $ORDER = 我与柱的距离,基于 API 参数 lnglat

最佳答案

好的,删除旧答案,因为它不是您想要的......

这是您需要的更多吗?

SELECT
*,
@radius * 2 * ASIN(SQRT(POWER(SIN(( @startlat - abs(b.lat)) * pi() / 180 / 2),2) +
COS( @startlat * pi()/180) * COS(abs(b.lat) * pi() / 180) * POWER(SIN(( @startlng - b.lng) *
pi() / 180 / 2), 2) )) AS distance
FROM 
drinks d
JOIN drink_bars db ON (db.drink_id = d.id)
JOIN bars b ON (b.id_id = db.bar_id)
WHERE d.name LIKE '%mojito%'
ORDER BY distance ASC

因此查询会查找一种饮料和所有有这种饮料的酒吧,并获取按距离排序的数据。

关于mysql - 在寻找饮料时找到最近的酒吧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25620723/

相关文章:

c# - 如何从 C# 中的 MySQL 查询结果中提取特定的日期和时间?

MySQL-优化case语句

PHP - MYSQL 从数组中查询多个值

mysql - SELECT IF 行到多列

Python MySQLdb 意外行为(?)

Sql 范围组开始和结束 ID

mysql - 相关产品方法建议,MySQL InnoDB/PHP

mysql - 大型数据库的查询优化

php - PHP MYSQL 的上一页/下一页

c# - 如何识别查询语句中有子查询?