2015-12-11 6 views
-1

Не знаю, правильно ли я описал проблему в заголовке, но здесь она идет.Получить строку для списка id, где определенное поле является максимальным в базе данных 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, где наибольшее значение имеет время маршрутизации.

Я пытаюсь добиться этого с помощью 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 
    } 
    ] 
} 

Как вы можете проблема заключается в том, что он возвращает наибольшее значение времени маршрутизации, но не соответствует остальным связанным значениям (широта, долгота и т. д.).

Как я могу это достичь?

Надеюсь, вы понимаете, чего я пытаюсь достичь. Любая помощь будет оценена.

+1

Этот вопрос задан и так часто встречается, что ему просто становится скучно – Strawberry

+0

@Strawberry, укажем на дубликат и давайте закроем вопрос. – innoSPG

+0

@innoSPG Создайте лучшую систему для канонических вопросов, и я буду – Strawberry

ответ

1

Edit: Пожалуйста, используйте только решение в моем ответе, если вы не заинтересованы в максимальной эффективности. В противном случае загляните в руководство 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 находит самый длинный маршрут, принадлежащий текущему Маршруту, из первого цикла и обеспечивает выбор только маршрутной точки с этим временем.

Я не уверен, что это будет работать в каждом случае, так как мне кажется, что условие где-то не будет работать в каком-либо краевом случае.

+0

Спасибо за помощь. Я получил его сейчас! Хотя это не сработало сразу. «Routes.user_id» следует изменить на «R.user_id». Я также добавил массив user_id к предложению where, поскольку мне нужны только те строки с user_id, которые указаны в массиве. В любом случае, я протестировал его с кучей разных сценариев, и до сих пор он работал так, как ожидалось. Примите +1 – Langkiller

+0

И да, меня интересует лучшая производительность. Я займусь этим следующим, но все же сохраняю это как временное решение. – Langkiller

+0

Приятно, чтобы вы все равно продвигались вперед. Применили ваши исправления и критерий пользователя. Попробует предоставить решение более результативного запроса, предложенного земляникой. Первые попытки не сработали, как ожидалось. Может быть, кто-то другой может (я бы, конечно, его продвинул). – user3469861

 Смежные вопросы

  • Нет связанных вопросов^_^