【问题标题】:Tricky query to find coordinates from a category and within radius从类别和半径内查找坐标的棘手查询
【发布时间】:2014-04-15 20:11:59
【问题描述】:

我无法提出一个涉及项目、类别和用户的相当复杂的查询。所有这些都必须结合在一起,以便选择要监视的给定类别的用户在半径内插入新项目时得到通知。

我已经有了这个查询,用来计算坐标和其他项目之间的距离。

SELECT i.id, ( 3959 * acos( cos( radians(-22.915037) ) * cos( radians( lat ) ) *
cos( radians( lng ) - radians(-43.207169) ) + sin( radians(-22.915037) )  *sin(radians(lat)) ) )*1.6 AS distance
FROM user u, item i
WHERE u.id = i.user_id
)

但我无法将所有内容放在一个 SQL 语句中。让我再解释一下。这有点棘手。

坐标(纬度、经度)在用户表中。用户有物品,物品属于给定的类别。有一个表格(我们称之为监视器),用户可以选择一个类别和一个半径(1、5、10、50 公里等)。

每次插入一个新项目时,我都会将它放在一个单独的表上(我们称之为 NewItems),这样我就可以单独处理它。

我想要的是,每次执行某个进程时,获取NewItems中的所有Item,并检查它们是否与Monitor中监视的Categories匹配,并且在配置的radius范围内,这样我就可以通知每个拥有的用户该类别和半径的监视器。

最后,我需要的只是一个包含 ItemID 和 UserID 的结果集(或表),因此我可以通过电子邮件通知每个用户,告诉他们在他们监控的类别和半径中插入了一个新项目。

关于我的表的更多细节(足以了解应该如何构建查询)。

Users: id, lat, lng

Item: id, user_id, category_id

Category: id, name

Monitor: category_id, user_id, radius

NewItems: item_id, flag_notified

【问题讨论】:

    标签: mysql coordinates


    【解决方案1】:

    这样的事情呢?

    SELECT DISTINCT u.id, n.id
    FROM Users u
    JOIN Monitor m
      on u.user_id = m.owning_user_id
    JOIN NewItems n
      on n.category_id = m.category_id
     and ( 3959 * acos( cos( radians(u.lat) ) * cos( radians( n.lat ) ) * cos( radians( n.lng ) - radians(u.lng) ) + sin( radians(u.lat) )  *sin(radians(n.lat)) ) )*1.6 < m.radius_in_km
    

    这假定该位置属于用户,并且监视器是类别和半径的组合。

    如果您需要性能更好的东西,空间索引可能会消除一些这样做的表扫描。

    【讨论】:

    • 感谢您的努力,但 NewItems 表没有坐标(它只有 Item_id),您有 n.latn.long。这是我遇到的主要问题之一。也许是另一种计算半径的方法?
    • 我添加了表格详细信息以帮助理解问题的“棘手之处”。 :)
    • 你怎么知道NewItems在哪里?如果你不知道,这不仅仅是棘手的:这是不可能的。如果您只知道其中一个位置,则无法测试两个位置之间的距离。
    • NewItems是Items,属于Users。我终于让查询工作了,我只需要与用户加入两次(一次用于项目所有者,另一次用于监控用户。
    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2011-05-31
    • 2016-01-12
    • 1970-01-01
    • 2013-08-01
    相关资源
    最近更新 更多