2017-08-09 63 views
0

我在MySQL中有一个多对多的关系,users表和posts表通过第三个post_user表连接。根据MySQL中连接表的派生值选择单行

这些帖子是在特定位置制作的,经纬度值会记录在每个帖子的旁边。

我想检索所有用户,并为每个用户他们的帖子是最接近给定点(在下面的示例中,坐标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

看到同样的方式来计算:[我为什么要对什么似乎提供了一个MCVE我是一个非常简单的SQL查询?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-tobe -a-very-simple-sql-query) – Strawberry

+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()功能做

+0

感谢您的解释,现在对我更有意义。我仍然有一个问题,但。我已经更新了我的问题,在原始选择中包含距离,我将它称为'xdistance',以将它与连接子句中的'distance'区分开来。当它只是“距离”时,我得到了结果,但每个用户有超过1个 - 我认为它使用了与联接子句的距离。根据我现在得到的问题将其更改为'xdistance':'on子句'中的未知列'xdistance'“(同样如果我尝试posts.xdistance) –

+1

这是因为你无法在同一个查询中使用别名,需要添加一个子查询。或者在“ON”条件下重写公式。在这里检查https://stackoverflow.com/questions/3550435/column-alias-not-recognized-in-where-statement –

+0

从'AND'切换到'HAVING'在最后似乎工作,但我会采取看重写是更高效的。谢谢 –