根据MySQL中连接表的派生值选择单行

时间:2017-08-09 15:31:24

标签: mysql join

我在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 

1 个答案:

答案 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()函数