获取 id 列表的行,其中特定字段在 MySQL 数据库中为最大值
Get row for a list of id's where a specific field is max in a MySQL database
我不知道我是否正确描述了标题中的问题,但在这里。
我在 MySQL 数据库中有以下 tables:
路线点:
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
_______________|___________|________________
| |
我想做的是:
Select 来自给定 user_id 列表的路由点 table 的数据,其中 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);
以上查询returns结果如下:
{
"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
}
]
}
如您所见,问题在于它 returns routepoint_time 的最大值,但它与其余相关值(纬度、经度等)不匹配。
我怎样才能做到这一点?
希望您能理解我想要实现的目标。任何帮助将不胜感激。
编辑:
如果您对最佳性能不感兴趣,请仅使用我的回答中的解决方案。否则请查看 mysql-manual(link strawberry 在对问题的评论中发布)。
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)
循环遍历路由点-table 中的每条记录。 where-condition 的 subselect 从第一个循环中找到属于当前 Route 的最长路由点,并确保只选择具有该时间的路由点。
我不确定这是否适用于所有情况,因为在我看来 where 条件在某些极端情况下不起作用。
我不知道我是否正确描述了标题中的问题,但在这里。
我在 MySQL 数据库中有以下 tables:
路线点:
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
_______________|___________|________________
| |
我想做的是: Select 来自给定 user_id 列表的路由点 table 的数据,其中 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);
以上查询returns结果如下:
{
"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
}
]
}
如您所见,问题在于它 returns routepoint_time 的最大值,但它与其余相关值(纬度、经度等)不匹配。
我怎样才能做到这一点?
希望您能理解我想要实现的目标。任何帮助将不胜感激。
编辑: 如果您对最佳性能不感兴趣,请仅使用我的回答中的解决方案。否则请查看 mysql-manual(link strawberry 在对问题的评论中发布)。
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)
循环遍历路由点-table 中的每条记录。 where-condition 的 subselect 从第一个循环中找到属于当前 Route 的最长路由点,并确保只选择具有该时间的路由点。
我不确定这是否适用于所有情况,因为在我看来 where 条件在某些极端情况下不起作用。