【发布时间】: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_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";
现在我得到了 lat、lng 和 ID,那么我要检查距离吗?最后谁是伙伴?还是我从寻找伴侣开始,然后重叠,然后距离?..等等。我认为我的开始是正确的,但我想优化它,使其尽可能快。基本上3个条件:
他们是伙伴(不同的桌子)
他们的时间不重叠(同一张表)
它们在 x 距离内(同一张桌子)
斗争是真实的。
【问题讨论】:
-
你试过什么?你有什么问题?因为看起来你已经拥有了所有的部分。
-
@JuanCarlosOropeza 我不擅长 SQL 条件语句,这对我来说有点复杂。我让它工作但在代码中 - 我正在切换到 sql 操作而不是代码
-
是的,看起来你已经弄清楚了所有的难点:-)
-
@Strawberry 附加的Haversine表结构不同,重叠的不是SQL。不,我没有弄清楚最困难的部分是在我的表结构上完成所有操作的一个 sql 语句:)
-
我明白了,但你至少能写出日期重叠的版本吗?向我们展示一些东西,以便我们为您提供指导。否则即使我可以看到您进行了一些研究,它看起来也像是一个“做我的工作”的问题。尝试比让其他人去做,你会学到更多。
标签: javascript mysql sql