2015-12-11 31 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

相关问题