- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这两个问题:
SELECT
(ACOS(least(1,COS(0.4878295615756141)*COS(-1.4391492410217162)*COS(RADIANS(places.lat))*COS(RADIANS(places.lng))+
COS(0.4878295615756141)*SIN(-1.4391492410217162)*COS(RADIANS(places.lat))*SIN(RADIANS(places.lng))+
SIN(0.4878295615756141)*SIN(RADIANS(places.lat))))*3963.1899999999996)
AS distance, places.*
FROM `places`
WHERE ((
(ACOS(least(1,COS(0.4878295615756141)*COS(-1.4391492410217162)*COS(RADIANS(places.lat))*COS(RADIANS(places.lng))+
COS(0.4878295615756141)*SIN(-1.4391492410217162)*COS(RADIANS(places.lat))*SIN(RADIANS(places.lng))+
SIN(0.4878295615756141)*SIN(RADIANS(places.lat))))*3963.1899999999996)
<= 200.0))
和
SELECT `companies`.*
FROM `companies`
INNER JOIN `service_areas` ON `service_areas`.`company_id` = `companies`.`id`
WHERE `companies`.`id` IN (1, 3, 6, ...) AND `service_areas`.`state_name` = 'CA'
它是这样工作的:第一个查询查找指定半径内的地点。第二个查询查找拥有第一个查询中找到的地点的所有公司。
第二个查询中的部分 - (1, 3, 6, ...)
- 在 ruby 中,我从地方获取所有 company_id
并将它们放入到第二个查询(company_id
是 places
表的一个属性)。
我试图将这两个查询合并为一个查询,因为我想按 distance
对公司进行排序(如果离给定点最近的地方属于“公司 A”,那么该公司将在输出中排在第一位)并且作为查询的结果,我正在尝试接收:
这似乎有点超出我的能力范围,我正在尝试将这两个查询合并为一个,因为对于两个查询,我必须使用 Ruby 进行一些操作(以过滤位置)并且这些操作最后来自60-90 秒...
提前感谢大家的宝贵时间。
编辑:我稍微修改了查询,如下所示:
SELECT places.*, companies.*,
69.0 * HAVERSINE(places.lat, places.lng, 27.950575,-82.45717) AS distance
FROM places
JOIN companies ON companies.id = places.company_id
JOIN service_areas ON service_areas.company_id = companies.id
WHERE places.lat BETWEEN 27.950575 - (200.0 / 69.0)
AND 27.950575 + (200.0 / 69.0)
AND places.lng BETWEEN -82.45717 - (200.0 / (69.0 * COS(RADIANS(27.950575))))
AND -82.45717 + (200.0 / (69.0 * COS(RADIANS(27.950575))))
AND companies.id = places.company_id
AND service_areas.state_name = 'CA'
ORDER BY distance
我还在 places.lat
和 places.lng
列上添加了索引。当我在 MySQL 控制台中运行这个查询时,我得到了 586 个结果;查询持续了 1 分 22 秒,当我第二次运行时 30 秒,第三次尝试时 18 秒。
我只是分析收到的结果以验证是否有我需要的。
编辑 2:
当我深入查看获取的结果时,我发现查询加载了 companies
,但始终没有加载 places
。我以为特定搜索没有地点
,所以我更改了城市等,但查询仍然没有返回任何地点
。
所以我尝试单独运行查询,如下所示:
SELECT places.*,
69.0 * HAVERSINE(places.lat,places.lng, 27.950575,-82.45717) AS distance
FROM places
WHERE places.lat
BETWEEN 27.950575 - (200 / 69.0)
AND 27.950575 + (200 / 69.0)
AND places.lng
BETWEEN -82.45717 - (200 / (69.0 * COS(RADIANS(27.950575))))
AND -82.45717 + (200 / (69.0 * COS(RADIANS(27.950575))))
并且此查询返回 6,600 个位置,查询持续了 30 秒。我试图改变“大”查询中 JOIN
的顺序,希望这可能会导致没有 places
被获取,但它没有帮助, 仍然没有 places
加载。我想知道是什么导致了这个问题。
编辑 3:
甚至尝试这样做(省略 service_areas
表上的 WHERE
以调试它并找出为什么永远不会返回任何 places
通过查询):
SELECT places.*,
69.0 * HAVERSINE(places.lat,places.lng, 27.950575,-82.45717) AS distance
FROM places
JOIN companies ON places.company_id = companies.id
WHERE places.lat
BETWEEN 27.950575 - (200 / 69.0)
AND 27.950575 + (200 / 69.0)
AND places.lng
BETWEEN -82.45717 - (200 / (69.0 * COS(RADIANS(27.950575))))
AND -82.45717 + (200 / (69.0 * COS(RADIANS(27.950575))))
结果是超过 5,000 家未过滤的公司,但仍然没有位置。
谢谢
最佳答案
看来你有两个问题。
places
表中查找内容并将其与其他表中的内容相关联。看起来您在(以度为单位)27.950575、-82.45717 的特定位置使用常量值。如果那是美国佛罗里达州坦帕市中心 Zack St 上的某个位置,我猜对了您常量的含义。我们将这些值称为 latpoint
和 lonpoint
。
另一个常量 3963.19 告诉我们您正在以英里为单位工作。每度数有 69 英里。
为了在不被大量数学淹没的情况下开始解决这个问题,让我们假设存在一个名为
的存储函数 HAVERSINE(lat1,long1, lat2,long2)
可以在这里找到这样的函数:http://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/
这样我们就可以构建可读性强的代码,让自己相信我们拥有正确的代码。
您的第一个查询可以使用一些不错的 WHERE 子句进行优化:
places.lat BETWEEN latpoint - (200.0 / 69.0)
AND latpoint + (200.0 / 69.0)
AND places.lon BETWEEN lonpoint - (200.0 / (69.0 * COS(RADIANS(latpoint))))
AND lonpoint + (200.0 / (69.0 * COS(RADIANS(latpoint))))
这些条款在您的起点周围划出了一个 200 英里的边界框。他们可以非常有效地在您的表中使用 (lat, lon)
上的索引。
因此,这将是您修改后的距离计算查询。
SELECT places.*,
69.0 * HAVERSINE(places.lat,places.lon, latpoint,lonpoint) AS distance
FROM places
WHERE places.lat BETWEEN latpoint - (200.0 / 69.0)
AND latpoint + (200.0 / 69.0)
AND places.lon BETWEEN lonpoint - (200.0 / (69.0 * COS(RADIANS(latpoint))))
AND lonpoint + (200.0 / (69.0 * COS(RADIANS(latpoint))))
ORDER BY distance
LIMIT 50
因为 WHERE
子句消除了 places
表中的许多行,这将节省大量时间。请参阅此以获得更完整的解释:http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/
现在我们已经准备好了高效查询的框架,我需要做一个假设。就是这样:您可以执行此 JOIN。
... places
JOIN companies ON companies.id = places.company_id
因此,将这些内容添加到您的查询中变得非常容易。 编辑有关companies
和places
表如何关联的信息。
SELECT places.*, companies.*,
69.0 * HAVERSINE(places.lat,places.lon, latpoint,lonpoint) AS distance
FROM places
JOIN companies ON companies.id = places.company_id
JOIN service_areas ON companies.id = service_areas.company_id
WHERE places.lat BETWEEN latpoint - (200.0 / 69.0)
AND latpoint + (200.0 / 69.0)
AND places.lon BETWEEN lonpoint - (200.0 / (69.0 * COS(RADIANS(latpoint))))
AND lonpoint + (200.0 / (69.0 * COS(RADIANS(latpoint))))
AND companies.id IN (1, 3, 6, ...) AND service_areas.state_name = 'CA'
ORDER BY distance
LIMIT 50
这将找到服务区域在加利福尼亚的所有公司,这些公司的服务区域在您的 latpoint,lonpoint
位置(恰好在在佛罗里达州)200 英里范围内)。
places
的复合索引:(company_id, lat, lon)
可能会提高此查询的性能。
如果您使用距离标准以避免混淆,您可能希望省略 state_name
标准。
关于mysql - 如何将地理位置查询与其他条件结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27066446/
我正在努力处理查询的 WHERE 部分。查询本身包含一个基于两个表中都存在的 ID 的 LEFT JOIN。但是,我要求 where 语句仅返回其中一列中存在的最大单个结果。目前我返回连接中的所有值,
我有这个代码来改变文件系统的大小。问题是,即使满足 if 条件,它也不会进入 if 条件,而我根本没有检查 if 条件。它直接进入 else 条件。 运行代码后的结果 post-install-ray
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
伪代码: SELECT * FROM 'table' WHERE ('date' row.date 或 ,我们在Stack Overflow上找到一个类似的问题: https://stackove
我有下面这行代码做一个简单的查询 if ($this->fulfilled) $criteria->addCondition('fulfilled ' . (($this->fulfilled
如果在数据库中找到用户输入的键,我将尝试显示“表”中的数据。目前我已将其设置为让数据库检查 key 是否存在,如下所示: //Select all from table if a key entry
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
在MYSQL中可以吗 一共有三个表 任务(task_id、task_status、...) tasks_assigned_to(ta_id、task_id、user_id) task_suggeste
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
下面两个函数中最专业的代码风格是什么? 如果函数变得更复杂和更大,例如有 20 个检查怎么办? 注意:每次检查后我都需要做一些事情,所以我不能将所有内容连接到一个 if 语句中,例如: if (veh
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
我试图在 case when 语句中放入两个条件,但我在 postgresql 中遇到语法错误 case when condition 1 and condition 2 then X else Y
我正在构建一个连接多个表的查询,一个表 prodRecipe 将包含某些行的数据,但不是全部,但是 tmp_inv1 将包含所有行的计数信息。问题是,tmp_inv1.count 取决于某个项目是否在
我有一个涉及 couples of rows which have a less-than-2-hours time-difference 的查询(~0.08333 天): SELECT mt1.*,
我有一个包含许多这样的 OR 条件的代码(工作正常)来检查其中一个值是否为空,然后我们抛出一条错误消息(所有这些都必须填写) } elsif ( !$params{'account'}
我有一个名为 spGetOrders 的存储过程,它接受一些参数:@startdate 和 @enddate。这将查询“订单”表。表中的一列称为“ClosedDate”。如果订单尚未关闭,则此列将保留
在代码中,注释部分是我需要解决的问题...有没有办法在 LINQ 中编写这样的查询?我需要这个,因为我需要根据状态进行排序。 var result = ( from contact in d
我正在尝试创建一个允许省略参数的存储过程,但如果提供了参数,则进行 AND 操作: CREATE PROCEDURE MyProcedure @LastName Varchar(30)
我正在寻找一种方法来过滤我的主机文件中的新 IP 地址。我创建了一个脚本,每次我用来自矩阵企业管理器的数据调用它时都会更新我的主机文件。它工作正常。但是我必须找到一个解决方案,只允许更新 10.XX.
所以我正在做一种 slider ,当它完全向下时隐藏向下按钮,反之亦然,当向上按钮隐藏时,我遇到了问题。 var amount = $('slide').attr('number'); $('span
我是一名优秀的程序员,十分优秀!