因此,在我的数据库中,我会在每个用户登录时跟踪上次已知的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行
显然......我想要一份完整的清单,为什么这不起作用?我觉得我错过了一些非常基本的东西,但我显然正在失去动力。
谢谢!
答案 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