2017-08-09 64 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'在最後似乎工作,但我會採取看重寫是更高效的。謝謝 –