MySql检索所有用户的最后已知位置列表

时间:2015-07-20 00:01:17

标签: mysql

因此,在我的数据库中,我会在每个用户登录时跟踪上次已知的GPS纬度和经度,以便稍后我可以使用此数据联系那些在特定GPS位置的特定半径范围内具有最后已知位置的人。为此,我首先需要获取数据库中存在的所有用户的最后已知位置列表。

以下是我的观点的查询:

SELECT u.email, l.latitude, l.longitude
from user u 
left join locationhistory l
on u.userid = l.userId
    WHERE (u.userId, l.userId) = 
    (Select userId, MAX(l.locationDate) 
    FROM locationHistory 
    GROUP BY userId)
group by email

我收到的错误是:     #1242 - 子查询返回超过1行

显然......我想要一份完整的清单,为什么这不起作用?我觉得我错过了一些非常基本的东西,但我显然正在失去动力。

谢谢!

1 个答案:

答案 0 :(得分:2)

当where子句需要一个单独的值时,子查询确实会返回多个值。一种解决方案是将查询更改为使用连接。

SELECT u.email, l.latitude, l.longitude
FROM user u 
JOIN locationhistory l ON u.userid = l.userId
JOIN (
   SELECT userId, MAX(locationDate) max_locationdate
   FROM locationHistory 
   GROUP BY userId
) x ON u.userId = x.userid AND l.locationdate = x.max_locationdate

编辑:我认为我犯了一个错误并且无意中过滤掉了没有位置的用户...如果您希望所有用户都显示,即使他们没有在locationhistory表中有任何记录,那么您想要的查询很有可能是这样的:

SELECT u.email, l2.latitude, l2.longitude
FROM user u 
LEFT JOIN (
  SELECT l1.* FROM locationhistory l1
  JOIN (
    SELECT userId, MAX(locationDate) max_locationdate
    FROM locationHistory 
    GROUP BY userId
  ) x ON l1.locationdate = x.max_locationdate AND l1.userId = x.userid
) l2 ON u.userid = l2.userId