获取一行列表,其中列出了MySQL数据库中特定字段为max的id

时间:2015-12-11 13:38:30

标签: php mysql mysqli groupwise-maximum

我不知道我是否正确地描述了标题中的问题,但现在就这样了。

我在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 
_______________|___________|________________  
               |           |

我想要做的是: 从routepoints表中为给定的user_id列表中选择数据,其中routepoint_time具有最大值。

我试图通过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 个答案:

答案 0 :(得分: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)

循环遍历routepoints-table中的每条记录。 where-condition的子选择从第一个循环中找到属于当前Route的最长路由点,并确保仅选择具有该时间的路径点。

我不确定这会在每种情况下都有效,因为在我看来,where条件在某些边缘情况下不起作用。