假设我有这两个表:
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_date
和 latitude|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";
现在我得到纬度、经度和 ID,然后我要检查距离吗?最后谁是队友?或者我是从寻找伙伴开始,然后是重叠,然后是距离?.. 等等。我认为我的开始是正确的,但我想优化它以使其尽可能快。基本上有 3 个条件:
他们是同 table (不同 table )
他们的时间不重叠(同 table )
他们在x距离之内(同一张 table )
斗争是真实的。
最佳答案
您将有 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
关于javascript - 如何在其他条件下应用 Haversine Formula?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45825448/