表: -
表1: - Person_LatLong
Person_Id
Lat
Lng
Location_DateTime
Person_LatLong数据: -
10 23.030211421184454 72.55705489668806 2014-09-02 04:23:42
10 23.03029215373424 72.55710855670746 2014-09-02 04:25:09
10 23.030301667271765 72.55715279051745 2014-09-02 04:27:21
11 19.045563510415214 72.915665750359 2014-09-02 08:22:07
11 19.046567530190785 72.91524330185979 2014-09-02 08:32:36
11 19.04553070382594 72.91621148133476 2014-09-02 08:39:47
11 18.537267778519347 73.83538450865574 2014-09-03 01:44:19
11 18.33554237666039 73.85274219500492 2014-09-03 07:18:02
11 18.331919816746026 73.8525499279805 2014-09-03 07:18:59
11 18.33181875247372 73.85243149060277 2014-09-03 07:19:02
11 18.777939290860722 73.31834934181029 2014-09-04 22:07:31
11 18.790032969638293 73.30265963437363 2014-09-04 22:09:06
11 18.79108238318203 73.29928216416553 2014-09-04 22:09:22
11 18.800857529132163 73.28531940244517 2014-09-04 22:11:22
11 18.812675453346255 73.27794458217039 2014-09-04 22:13:26
11 18.82985965773455 73.25592224937081 2014-09-04 22:15:31
11 18.84531169311457 73.23344887176076 2014-09-04 22:17:49
11 18.869063931831764 73.2185512231118 2014-09-04 22:19:54
11 18.893204517796047 73.20479873759578 2014-09-04 22:22:03
11 18.910161939581506 73.18348844819505 2014-09-04 22:24:30
表2: - LS_For
Subject_Id -> This is basically Person_Id but I have changed the name.
Watcher_Id
Assistance_Group_Id
LS_For表数据: -
1 10 1
1 11 1
1 17 1
查询: -
SELECT *,( 6371 * acos( cos( radians(23.030) )
* cos( radians(Lat) ) * cos( radians(Lng) - radians(72.5570) )
+ sin( radians(23.030) ) * sin( radians(Lat) ) ) )
AS distance FROM Person_LatLong WHERE Person_Id IN
(SELECT Watcher_Id FROM LS_For WHERE Subject_Id = 1 AND Assistance_Group_Id = 1)
HAVING distance < 5 ORDER BY Location_DateTime DESC;
输出如下: - ID |拉特| LNG |日期时间| DISTANCE
10 23.030301667271765 72.55715279051745 2014-09-02 04:27:21 0.037008818510632306
10 23.03029215373424 72.55710855670746 2014-09-02 04:25:09 0.03433299317128307
10 23.030211421184454 72.55705489668806 2014-09-02 04:23:42 0.02417068347133403
11 23.030301667271765 72.55715279051745 2014-09-02 05:27:21 0.037008818510632306
11 23.03029215373424 72.55710855670746 2014-09-02 05:25:09 0.03433299317128307
11 23.030211421184454 72.55705489668806 2014-09-02 05:23:42 0.02417068347133403
添加GROUP BY后: -
SELECT *,( 6371 * acos( cos( radians(23.030) )
* cos( radians(Lat) ) * cos( radians(Lng) - radians(72.5570) )
+ sin( radians(23.030) ) * sin( radians(Lat) ) ) )
AS distance FROM Person_LatLong WHERE Person_Id IN
(SELECT Watcher_Id FROM LS_For WHERE Subject_Id = 1 AND Assistance_Group_Id = 1)
GROUP BY Person_Id HAVING distance < 5 ORDER BY Location_DateTime DESC;
给我以下输出: -
10 23.030211421184454 72.55705489668806 2014-09-02 04:23:42 0.02417068347133403
但我希望最新的时间行不是最老的。
OUTPUT要求: - 使用2个表,LS_For是我找到Ids的表,我必须根据距离来查找位置距离并根据需要过滤结果。
10 23.030301667271765 72.55715279051745 2014-09-02 04:27:21 0.037008818510632306
11 23.030301667271765 72.55715279051745 2014-09-02 05:27:21 0.037008818510632306
答案 0 :(得分:3)
生成一组数据,其中包含每个人的最大日期时间(最近),然后INNER JOIN到它,以便您的基本集仅限于person_LatLong中的最新条目。
(Select person_ID, max(`Location_DateTime`) mldt FROM person_LatLong group by Person_ID)
为每个用户生成最新的latLong ......然后......
可能1
SELECT a.Person_ID, a.LAT, a.LNG, a.`Location_DateTime`,
( 6371 * acos( cos( radians(23.030) )
* cos( radians(a.Lat) ) * cos( radians(a.Lng) - radians(72.5570) )
+ sin( radians(23.030) ) * sin( radians(a.Lat) ) ) ) AS Distance
FROM Person_LatLong a
INNER JOIN (SELECT Person_ID, max(`Location_DateTime`) as mldt
FROM Person_latLong
GROUP BY Person_ID) P
on P.Person_ID = a.Person_Id
and P.mldt = a.`Location_DateTime`
LEFT JOIN LS_FOR C
on a.Person_Id = C.Watcher_ID
AND C.Subject_Id = 1
AND C.Assistance_Group_Id = 1
GROUP BY a.Person_ID, a.LAT, a.LNG, a.`Location_DateTime`
HAVING Distance < 5;
可能2
SELECT a.Person_ID, a.LAT, a.LNG, a.`Location_DateTime`,
( 6371 * acos( cos( radians(23.030) )
* cos( radians(a.Lat) ) * cos( radians(a.Lng) - radians(72.5570) )
+ sin( radians(23.030) ) * sin( radians(a.Lat) ) ) ) AS Distance
FROM Person_LatLong a
INNER JOIN (SELECT Person_ID, max(`Location_DateTime`) as mldt
FROM Person_latLong
GROUP BY Person_ID) P
on P.Person_ID = a.Person_Id
and P.mldt = a.`Location_DateTime`
INNER JOIN LS_FOR C
on a.Person_Id = C.Watcher_ID
WHERE C.Subject_Id = 1
AND C.Assistance_Group_Id = 1
GROUP BY a.Person_ID, a.LAT, a.LNG, a.`Location_DateTime`
HAVING Distance < 5;
我修改了将LS_FOR视为左连接的响应,因为LS_FOR中没有每个用户的记录,即使他们没有主题ID或aid_groupID也不会返回该人。 ......
换句话说,上面应该用简单的英语返回:
将为每个唯一的Person_ID返回最新的personLatLong;只要距离<1。 5如果LS_FOR和PersonLatLong条目中有条目,则只返回subjectID为1且asstianceGorupID为1的记录。如果LS_FOR中没有条目,它仍将返回该人(也许你确实希望它作为内部联接...)
答案 1 :(得分:0)
而不是
GROUP BY Person_I
使用
LIMIT 1
OR
GROUP BY Person_Id HAVING distance < 5 ORDER BY Location_DateTime DESC;
到
GROUP BY Person_Id HAVING distance < 5 ORDER BY Location_DateTime ASC;
答案 2 :(得分:0)
检查此链接。
Retrieving the last record in each group
这里的解决方案比子查询快得多。
select person1.* from Person_LatLong person1
LEFT JOIN Person_LatLong person2 on person1.id = person2.id and
person1.dateTiem < person2.dateTime
where person2.id IS NULL;
这将为您提供最新记录。
答案 3 :(得分:0)
尝试这样做:
SELECT
*,( 6371 * acos( cos( radians(23.030) ) * cos( radians(Lat) ) * cos( radians(Lng) - radians(72.5570) ) + sin( radians(23.030) ) * sin( radians(Lat) ) ) ) AS distance
FROM
(select * from Person_LatLong ORDER BY Location_DateTime DESC) as t
WHERE
Person_Id IN (SELECT Watcher_Id FROM LS_For WHERE Subject_Id = 1 AND Assistance_Group_Id = 1)
GROUP BY
Person_Id
HAVING
distance < 5 ;