Получить строку для списка идентификаторов, где конкретное поле является максимальным в базе данных MySQL

Я не знаю, правильно ли я описал проблему в названии, но здесь все сказано.

У меня есть следующие таблицы в базе данных 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
_______________|___________|________________
|           |

То, что я пытаюсь сделать, это:
Выберите данные из таблицы точек маршрута для заданного списка 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

Решение

Редактировать:
Пожалуйста, используйте решение только в моем ответе, если вы не заинтересованы в максимальной производительности. В противном случае загляните в руководство по mysql (ссылка, опубликованная клубникой в ​​комментариях к вопросу).

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 не будет работать в некотором пограничном случае.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]