我在MySQL中有多对多的关系,users
表和posts
表通过第三个post_user
表链接。
帖子是在特定位置制作的,每个帖子旁边都会记录一个纬度/经度值。
我想检索所有用户,并为每个用户检索最接近给定点的帖子(在下面的示例中,坐标为43.429124 / -0.294401)。我只想要每个用户一个帖子(他们会有很多)。
我查看了类似的问题/答案并尝试了各种查询,但还未能找到一个运作正常的问题。
我目前的最大努力就是这个......
SELECT *, (acos(cos(radians(43.429124)) * cos(radians(posts.lat)) * cos(radians(posts.long) - radians(-0.294401)) + sin(radians(43.429124)) * sin(radians(posts.lat)))) AS xdistance
FROM users
INNER JOIN post_user ON users.id = post_user.user_id
INNER JOIN posts ON posts.id = post_user.post_id
INNER JOIN (
SELECT id, MIN(acos(cos(radians(43.429124)) * cos(radians(posts.lat)) * cos(radians(posts.long) - radians(-0.294401)) + sin(radians(43.429124)) * sin(radians(posts.lat)))) AS distance
FROM posts
GROUP BY posts.id
) subposts on posts.id = post_user.post_id AND xdistance = subposts.distance
答案 0 :(得分:1)
您必须找到所有用户帖子之间的最小距离,然后找出哪个帖子的距离相同。
INNER JOIN (
SELECT post_user.user_id, MIN(...) AS distance
FROM post_user
JOIN posts
ON post_user.post_id = posts.id
GROUP BY post_user.user_id -- minimum distance for each user
) as subposts
on post_user.user_id = subposts.user_id
AND posts.distance = subposts.distance -- post with the same minimum distance
我认为你没有列post.distance
你可能需要使用公式来计算MIN()
函数