2015-12-11 27 views
-1

我不知道我是否正確描述了標題中的問題,但是在這裏。在MySQL數據庫中獲取特定字段爲最大的id列表

我有一個MySQL數據庫中的以下表:

路線點:

routepoint_id | route_id | latitude |  longitude  | location | routepoint_time 
_________________|__________|________________|___________________|__________|__________________ 
     24  | 38  | 9.32454363 | 10.65785453 | blah |  1232455678 
     25  | 38  | 56.72112300 | 11.40735700 | blah | 3324546454363 
     26  | 39  | 12.83276562 | 12.83276562 | blah | 54321325541 
     27  | 39  | 52.72112300 | 10.23400000 | blah | 64321325541  
_________________|__________|________________|___________________|__________|__________________ 
       |   |    |     |   | 

和路線

route_id | user_id | creation_date 
_______________|___________|________________ 
     38  | 18  | 1243256576 
     39  | 16  | 3463468576543 
_______________|___________|________________ 
       |   | 

我所試圖做的是這樣的: 從選擇數據路由點表,其中route_point_time具有最大值的user_id的給定列表。

我試圖通過PHP和mysqli的,我給下面的查詢USER_ID陣列來實現這一目標:

$stmt = $this->con->prepare("SELECT routes.user_id, routepoints.latitude, routepoints.longitude, MAX(routepoints.routepoint_time) AS maxTime, users.status 
          FROM routepoints 
          INNER JOIN routes ON routepoints.route_id = routes.route_id 
          INNER JOIN users ON routes.user_id = users.user_id 
          WHERE routes.user_id IN ({$idArray}) 
          GROUP BY routes.user_id"); 
      $stmt->execute(); 
      $stmt->store_result(); 
      $stmt->bind_result($user_id, $latitude, $longitude, $routePointTime, $status); 

上面的查詢返回以下結果:

{ 
    "status": true, 
    "friendsLocationList": [ 
    { 
     "userId": 16, 
     "latitude": 12.83276562, 
     "longitude": 12.83276562, 
     "routePointTime": "64321325541", 
     "onlineStatus": 0 
    }, 
    { 
     "userId": 18, 
     "latitude": 9.32454363, 
     "longitude": 10.65785453, 
     "routePointTime": "3324546454363", 
     "onlineStatus": 0 
    } 
    ] 
} 

,你可以看,問題是它返回routepoint_time的最大值,但它不匹配關聯值的其餘部分(緯度,經度等)。

我該如何做到這一點?

我希望你明白我想達到的目標。任何幫助將不勝感激。

+1

這個問題被問及經常回答,它只是無聊 – Strawberry

+0

@Strawberry,指向重複,讓我們關閉問題。 – innoSPG

+0

@innoSPG建立一個更好的規範問題系統,我會 – Strawberry

回答

1

編輯: 只請使用該解決方案在我的答案,如果你不感興趣,可能最好的性能。否則,看一看mysql-manual(草莓在發表評論時發佈的鏈接)。

SELECT 
    R.user_id, 
    RP.route_id, 
    RP.latitude, 
    RP.longitude, 
    RP.routepoint_time AS maxTime 

FROM routepoints AS RP 

    INNER JOIN routes AS R 
    ON RP.route_id = R.route_id 

    INNER JOIN users 
    ON R.user_id = users.user_id 

WHERE 
    RP.routepoint_time = (
     SELECT max(RP2.routepoint_time) 
     FROM routepoints AS RP2 
     WHERE RP2.route_id = RP.route_id 
    ) 
    R.user_id IN (16,18) 

循環路由點表中的每條記錄。 where條件的子查詢從第一個循環中找到屬於當前路由的最長路由點,並確保僅選擇具有該時間的路由點。

我不確定這在任何情況下都能正常工作,因爲在我看來,在某些邊緣情況下,where條件不起作用。

+0

感謝您的幫助。我現在開始工作了!雖然它沒有馬上工作。 「routes.user_id」應該改爲「R.user_id」。我還將user_id的數組添加到了where子句中,因爲我只需要那些在數組中指定了user_id的行。無論如何,我測試了一堆不同的場景,直到現在它按預期工作。接受+1 – Langkiller

+0

是的,我對可能的最佳表現感興趣。接下來我會研究這個問題,但仍然將此作爲臨時解決方案。 – Langkiller

+0

不錯,你upvote不過。應用您的更正和用戶標準。將試圖提供一個解決方案,以提高草莓的性能查詢。第一次嘗試沒有按預期工作。也許有人願意(當然,我會贊成的)。 – user3469861

相關問題