- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个站点,允许用户在他们自己的邮政编码的指定半径范围内搜索其他用户。我首先必须定位用户的纬度和经度,并使用该数据计算并找到其他用户。我已经根据 2 个必需的表准备了以下查询,但收到需要另一个别名的错误。如果我对这些值进行硬编码,那么当我将它们拆分出来时,部分查询工作会找到,但是对于多个连接和子查询,我一直没有成功。寻找任何指导或帮助。下面包含查询和表结构。
根据反馈编辑查询和数据集。不再收到错误,但没有收到任何返回的查询数据。
SQL语句
SELECT u.username, u.zip, m.longitude,
m.latitude,
m.zip from users u, zipcodes m
LEFT JOIN (SELECT s.zip,
s.username from users s) t
on m.zip = t.zip
and t.username = 'tester55'
INNER join ( SELECT zip, city, state, ( 3959 * acos( cos( radians(@m.latitude) ) * cos( radians( latitude ) )
* cos( radians( longitude ) - radians(@m.longitude) ) + sin( radians(@m.latitude) ) * sin(radians(latitude)) ) ) AS distance
FROM zipcodes
HAVING distance < 5000
ORDER BY distance) as RelevantCodes
ON (t.zip=RelevantCodes.zip)
用户表
username zip
-----------------------
tester55 60608
Tester1 60608
iosuser1 73120
Tester3 60608
zip 表
latitude longitude zip
--------------------------------
41.8515 -87.6694 60608
35.5835 -97.5638 73120
36.3169 -94.1545 72758
最佳答案
我现在没有时间计算出正确的查询,但我会第一眼展示现有查询的错误之处。
1) 关于您的实际问题:错误消息显示为 ERROR 1248 (42000): Every derived table must have its own alias
并且已经说明了问题所在。下面部分的子查询
LEFT JOIN (select s.zip,
s.username,
m.longitude,
m.latitude,
m.zip
from users s) on u.zip = s.zip
需要自己的别名,所以最终应该是
LEFT JOIN (select s.zip,
s.username,
m.longitude,
m.latitude,
m.zip
from users s) t on u.zip = t.zip
(注意右括号后的 t 以及用 t.zip 替换 s.zip)。但即使这样做,您也会遇到问题 2(请参阅下一节)。
2) 子查询
(select s.zip,
s.username,
m.longitude,
m.latitude,
m.zip
from users s)
将抛出另一个错误,因为表 m 在该子查询中是未知的。
如果您能够正确解决问题,我建议您编辑您的问题并让我们知道结果。如果没有,请发表评论或编辑您的问题,描述您遇到的其他问题。
编辑
我现在已经为您制定了解决方案:
SELECT zipcodes.zip,
(3959 * acos(cos(radians(zipcodes.latitude)) *
cos(radians(center.latitude)) *
cos(radians(zipcodes.longitude ) -
radians(center.longitude)) +
sin(radians(zipcodes.latitude)) *
sin(radians(center.latitude)))) AS distance FROM
( SELECT users.username,
users.zip,
zipcodes.latitude,
zipcodes.longitude FROM
(users JOIN zipcodes ON users.zip = zipcodes.zip)
WHERE (username='Tester1')
) center, zipcodes
HAVING (distance < 5000)
ORDER BY distance;
这会选择所需距离内的所有邮政编码,并按距离排序。
您可能会注意到,我已经简化了代码。另请注意,我已经根据您的旧数据(您在编辑前显示的数据)对此进行了测试,但使用 Tester1
而不是 tester55
.
您确实需要 HAVING
而不是 WHERE
过滤时,所以我最初的声明具有误导性。原因是 MySQL 不允许在 WHERE
中计算列(在本例中为距离)。条款,但在HAVING
条款。这是非标准行为;通常,你必须用另一种方式解决这个问题。我不会对此进行详细说明,因为它是另一个可能令人担忧的事情,与您的原始问题没有密切关系。
编辑 2
最后,这是另外提供用户名的版本:
SELECT zipcodes.zip,
users.username,
(3959 * acos(cos(radians(zipcodes.latitude)) *
cos(radians(center.latitude)) *
cos(radians(zipcodes.longitude ) -
radians(center.longitude)) +
sin(radians(zipcodes.latitude)) *
sin(radians(center.latitude)))) AS distance FROM
( ( SELECT users.username,
users.zip,
zipcodes.latitude,
zipcodes.longitude FROM
(users JOIN zipcodes ON users.zip = zipcodes.zip)
WHERE (username='Tester1')
) center, zipcodes) INNER JOIN users ON zipcodes.zip = users.zip
WHERE (users.username <> 'Tester1')
HAVING (distance < 5000)
ORDER BY distance;
请注意,您需要倒数第三行来过滤掉您为其计算距离的用户。如果您不这样做,结果将包含一行用户本身(在本例中为:Tester1
)和(接近)0
的距离。 .
编辑 3
以下是以下评论要求的版本(所需的搜索半径存储为表 seekingdistance
中的附加字段 users
):
SELECT zipcodes.zip,
users.username,
center.seekingdistance,
(3959 * acos(cos(radians(zipcodes.latitude)) *
cos(radians(center.latitude)) *
cos(radians(zipcodes.longitude ) -
radians(center.longitude)) +
sin(radians(zipcodes.latitude)) *
sin(radians(center.latitude)))) AS distance FROM
( ( SELECT users.username,
users.zip,
users.seekingdistance,
zipcodes.latitude,
zipcodes.longitude FROM
(users JOIN zipcodes ON users.zip = zipcodes.zip)
WHERE (username='Tester1')
) center, zipcodes) INNER JOIN users ON zipcodes.zip = users.zip
WHERE (users.username <> 'Tester1')
HAVING (distance < center.seekingdistance)
ORDER BY distance;
关于mysql - 在另一个用户邮政编码的半径范围内定位用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46106188/
我有 2 个表:city 和 city_neighbor。 city 包含所有城市的列表,而 city_neighbor 包含给定城市的邻居:insert into city_neighbor (ci
我需要一点帮助来了解我使用 RADIUS+LDAP 的无线登录是否足够安全。 我有这样的基础设施:PC 客户端 (Linux) + ASUS AP Wireless + FreeRadius 和 OP
我正在为我的应用程序使用 Google Maps iOS sdk。在我的应用程序中,用户可以绘制一个栅栏(一个圆圈),然后可以编辑以更改和调整圆的半径。 它的大小调整正确但是当半径值改变它的瞬间时,不
我想为我的搜索表单使用传单标记(用于 latLng)和 slider (用于半径)。 mongodb 部分将像 location: { $geoWithin: { $centerSpher
我有一个有背景的 ImageView。我需要将 border-radius 设置到我的 ImageView。我在另一个 XML 文件中使用以下代码并将其设置为 android:src 但是当我设置背景
我正在使用 Bing Maps API 构建一个 javascript 应用程序,我想根据中心点和扇形参数构成扇形几何图形。 我在 PostgreSQL 数据库中有一个表“points”,顶部是 Po
我在我的游戏中创建了一个 ATriggerSphere 实例,并将其放置在我角色的位置,如下所示: //Create activate trigger radius activateRadiusTri
我有对图像应用一些变换以检测圆圈的代码 (GaussianBlur->cvtColor(gray)->canny->HoughCircles) 结果我得到了vector circles;数组。 如果我
在我使用 bootsrap 3 的 Rails 应用程序中,我的导航栏上似乎有一个奇怪的 4px 边界半径,我似乎无法摆脱它。 我试过了 .navbar { border-radius: none
你好我想做半圆旋转轮。所以我为此使用了iCarousel。我的问题是如何根据屏幕尺寸改变轮子的半径。 这些是我的约束。 这个红色 View 是 iCarousel View 最佳答案 有一个值 iCa
我正在尝试: 没有角半径。 所有角半径 == 10dp。 是否有可能以及如何指定角:10dp(左上)10dp(右上)0 0(下)? 最佳答案 在 Android 开发者中 http://devel
我正在使用来自 https://developers.google.com/maps/documentation/javascript/examples/drawing-tools 的这个例子使用户能
我对 MySql 相当陌生,我想要创建一个过程,在其中我可以插入任何邮政编码和距离,然后取回该距离内的所有邮政编码。我确实找到了一个公式并尝试根据我的需要 reshape 它,但我无法做到。我所拥有的
我通过 RomainNurik 使用库向用户显示 Undo-Toast(如在 Gmail 应用程序中) 在 KitKat 之前,toast 选项是矩形的,而在 KitKat 中,toast 消息是圆角
默认情况下,iPad 模态表单获得圆角。在一些 Apple 的应用程序中,例如 iTunes,表单具有完美的方角。是否有一种相对简单的方法可以删除不会让我被 App Store 拒绝的圆角半径? 最佳
我的数据库有各种兴趣点。我希望用户根据他们的位置看到他们。还有3个按钮,显示2km/5km/15km半径内的兴趣点。我无法对这些半径实现放大功能。所以我正在寻找缩放系数(从 2 到 21)和物理距离(
使用 CSS,我可以在选项卡导航器中设置选项卡顶 Angular 的圆 Angular 半径: .tabstyle { corner-radius: 10;
我有这个标签,我只想在右上角和左上角做圆 Angular 。但它最终绕过了所有 4 个 Angular 。 我做了什么: 和 我的 pageStyles.css 文件是: .my
有人可以帮助我在我的谷歌地图标记周围添加一个圆/半径吗? function createMarker ( size, i,id,lat,lng,pin,title,counter,image,pr
我的网站布局很奇怪(由我的客户设计),但我开发得很好。 问题是 Chrome(版本 22)不工作,但在 Firefox(版本 16)和 IE 9 中工作。 问题出在 colRight 中,有两个 di
我是一名优秀的程序员,十分优秀!