【问题标题】:How to apply Haversine Formula with another condition?如何在其他条件下应用 Haversine Formula?
【发布时间】:2017-08-22 19:23:21
【问题描述】:

假设我有这两个表:

the_schedule_table:

+-----+---------------------+---------------------+-----------+------------+
| id  | start_date          | end_date            | latitude  | longitude  |
+-----+---------------------+---------------------+------------------------+
| 1   | 2017-07-17 12:00:00 | 2017-07-17 14:00:00 | 42.330078 | -83.045074 |
| 2   | 2017-07-17 8:00:00  | 2017-07-17 11:00:00 | 42.330380 | -83.037918 |
| 3   | 2017-07-17 13:00:00 | 2017-07-17 15:00:00 | 42.351314 | -83.067020 |
| 4   | 2017-07-17 11:00:00 | 2017-07-17 13:00:00 | 42.474879 | -83.241544 |
| 5   | 2017-07-17 15:00:00 | 2017-07-17 17:00:00 | 42.271986 | -83.742137 |
+-----+---------------------+---------------------+-----------+------------+

团队:

+-----+--------+------+
| id  | member | mate | 
+-----+--------+------+
| 1   | 1      | 2    | 
| 2   | 1      | 3    | 
| 3   | 1      | 4    | 
| 4   | 1      | 5    | 
| 5   | 2      | 1    | 
+-----+--------+------+

然后,假设Id = 1 使用特定的start_date|end_datelatitude|longitude 调用API,将它们称为target,并想知道在X 距离内的伙伴是谁他的数据,他们的start_date->end_date 不与他的重叠。

对于重叠我可以这样做:(StartA > EndB) and (EndA < StartB)

对于距离我需要结合这个:SQL query of Haversine formula

这个sql语句怎么写?

编辑: 我有重叠的部分,我对其进行了测试,它给出了正确的结果:

// query overlapped activites - based on data time
const myQuery = 
    "SELECT * FROM schedule " +
    "WHERE start_date > '" + toMySqlFormat(target_end_date) +
    "' AND '" + toMySqlFormat(target_start_time) + "' > end_date";

现在我得到了 lat、lng 和 ID,那么我要检查距离吗?最后谁是伙伴?还是我从寻找伴侣开始,然后重叠,然后距离?..等等。我认为我的开始是正确的,但我想优化它,使其尽可能快。基本上3个条件:

  • 他们是伙伴(不同的桌子)

  • 他们的时间不重叠(同一张表)

  • 它们在 x 距离内(同一张桌子)

斗争是真实的。

【问题讨论】:

  • 你试过什么?你有什么问题?因为看起来你已经拥有了所有的部分。
  • @JuanCarlosOropeza 我不擅长 SQL 条件语句,这对我来说有点复杂。我让它工作但在代码中 - 我正在切换到 sql 操作而不是代码
  • 是的,看起来你已经弄清楚了所有的难点:-)
  • @Strawberry 附加的Haversine表结构不同,重叠的不是SQL。不,我没有弄清楚最困难的部分是在我的表结构上完成所有操作的一个 sql 语句:)
  • 我明白了,但你至少能写出日期重叠的版本吗?向我们展示一些东西,以便我们为您提供指导。否则即使我可以看到您进行了一些研究,它看起来也像是一个“做我的工作”的问题。尝试比让其他人去做,你会学到更多。

标签: javascript mysql sql


【解决方案1】:

您将有 4 个参数 @member_id、@start_date、@end_date、@distance

你需要使用JOIN来找出member = 1的伙伴

然后你可以查明这些伙伴是否与日期不重叠。链接中的条件表示重叠,您想要反转条件,所以添加NOT

最后使用检查公式的结果是否小于@distance

 SELECT *
 FROM member M 
 JOIN the_schedule_table S
   ON M.mate = S.id
 WHERE NOT (S.start_date < @end_date AND S.end_date > @start_date)
   AND ( { Haversine formula } ) < @distance
   AND M.member = @member_id

【讨论】:

  • 看起来不错,可以为每一行添加一些简短的 cmets 吗?比如FROM member m是什么?我通常知道FROM mytable 是什么,谢谢我正在测试它:)
  • 看起来你应该先尝试一个教程来获得基础知识。检查这个w3schools.com/sql/default.aspM 被称为别名,因此代码更易于阅读。
  • 罗杰。感谢您的链接
猜你喜欢
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2011-11-16
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多