MySQL возвращает только последнюю запись даты/времени

У нас есть база данных, в которой каждую минуту хранится GPS-позиция автомобиля, дата, время, идентификация автомобиля, широта, долгота, скорость и т. д.

Следующий выбор извлекает позицию и информацию о каждом транспортном средстве, но проблема в том, что возвращается первая запись, а мне нужна последняя запись (текущая позиция) на основе даты (datagps.Fecha) и времени (datagps.Hora). Это выбор:

SELECT configgps.Fichagps, 
       datacar.Ficha, 
       groups.Nombre, 
       datagps.Hora, 
       datagps.Fecha, 
       datagps.Velocidad, 
       datagps.Status, 
       datagps.Calleune, 
       datagps.Calletowo, 
       datagps.Temp, 
       datagps.Longitud, 
       datagps.Latitud, 
       datagps.Evento, 
       datagps.Direccion, 
       datagps.Provincia 
  FROM asigvehiculos 
  INNER JOIN datacar ON (asigvehiculos.Iddatacar = datacar.Id) 
  INNER JOIN configgps ON (datacar.Configgps = configgps.Id) 
  INNER JOIN clientdata ON (asigvehiculos.Idgroup = clientdata.group) 
  INNER JOIN groups ON (clientdata.group = groups.Id) 
  INNER JOIN datagps ON (configgps.Fichagps = datagps.Fichagps) 
  Group by Fichagps;

Мне нужен тот же результат, что и у меня, но вместо старой записи мне нужна самая последняя (ПОСЛЕДНЯЯ датагпс.Феча / датагпс.Хора).

Как я могу это сделать?


person Community    schedule 26.09.2009    source источник


Ответы (4)


Добавьте ORDER BY datagps.Fecha DESC, datagps.Hora DESC LIMIT 1 к вашему запросу.

person rael_kid    schedule 26.09.2009
comment
Спасибо за вашу помощь!... но нет, это делает тот результат, который я получал, но не приносит самую последнюю запись. Другими словами, этот запрос возвращает список из 5 транспортных средств, ваше предложение упорядочивает этот список по дате и времени в порядке, но дата и время являются первыми записями этих транспортных средств (например: 2007-07-26), и мне нужно самое последнее. Я думаю, что решение находится в ГДЕ, или с использованием max(datagps.Fecha) или что-то в этом роде, а не с заказом по... предложениям? Мне нужно извлечь последние записанные записи - person ; 26.09.2009
comment
Я не думаю, что понимаю, что вы имеете в виду. Можете ли вы привести пример? - person rael_kid; 26.09.2009
comment
Я думаю, вам просто нужно изменить DESC на ASC. - person eipark; 27.09.2012

Я не уверен, почему у вас возникли проблемы с этим, поскольку ответы Лекса кажутся хорошими.

Я бы начал помещать ORDER BY в ваш запрос, чтобы он располагал их в порядке, когда он показывает запись, которую вы хотите, как первую в списке, а затем добавляет LIMIT.

Если вам нужна самая последняя версия, то достаточно будет следующего:

ORDER BY datagps.Fecha DESC, datagps.Hora DESC

Если вам просто нужна запись, которая была добавлена ​​в базу данных совсем недавно (независимо от полей даты/времени), вы могли бы (при условии, что у вас есть автоинкрементный первичный ключ в таблице datagps (я предполагаю, что он называется dataID для этого примера) )):

ORDER BY datagps.dataID DESC

Если они не отображают нужные вам данные, то в вашем примере чего-то не хватает (может быть, типы данных не являются полями DATETIME? - если нет - тогда, возможно, CONVERT для изменения их текущего типа перед ORDERing BY будет хорошая идея)

РЕДАКТИРОВАТЬ: я видел скриншот, и я не понимаю, в чем проблема. Вроде показывает все по порядку. Вы подразумеваете, что существует намного больше, чем 5 записей? Сколько вы ожидаете?

person Amadiere    schedule 26.09.2009
comment
Позвольте мне объяснить лучше: я ожидаю 5 записей, но, например: первая запись, Ficha SKODA дата 2009-09-15, это дата первого отчета о транспортном средстве, мне нужен отчет, скажем, , сегодня, 26 сентября 2009 г. Другими словами, он показывает результаты первой записи, а мне нужна последняя запись. - person ; 26.09.2009

Вы имеете в виду: для каждой возвращаемой записи вы хотите, чтобы к результату была прикреплена одна строка из таблицы datagps с последней датой и временем? Если да, то как насчет этого:

# To show how the query will be executed
# comment to return actual results
EXPLAIN

SELECT
configgps.Fichagps, datacar.Ficha, groups.Nombre, datagps.Hora, datagps.Fecha,
datagps.Velocidad, datagps.Status, datagps.Calleune, datagps.Calletowo,
datagps.Temp, datagps.Longitud, datagps.Latitud, datagps.Evento,
datagps.Direccion, datagps.Provincia

FROM asigvehiculos
INNER JOIN datacar ON (asigvehiculos.Iddatacar = datacar.Id)
INNER JOIN configgps ON (datacar.Configgps = configgps.Id)
INNER JOIN clientdata ON (asigvehiculos.Idgroup = clientdata.group)
INNER JOIN groups ON (clientdata.group = groups.Id)
INNER JOIN datagps ON (configgps.Fichagps = datagps.Fichagps)

########### Add this section
LEFT JOIN datagps b ON (
    configgps.Fichagps = b.Fichagps

    # wrong condition
    #AND datagps.Hora < b.Hora
    #AND datagps.Fecha < b.Fecha)

    # might prevent indexes to be used
    AND (datagps.Fecha < b.Fecha OR (datagps.Fecha = b.Fecha AND datagps.Hora < b.Hora))

WHERE b.Fichagps IS NULL
########### 

Group by configgps.Fichagps;

Аналогичный вопрос здесь только тот, что один использует внешние соединения.

Изменить (снова): условия неверны, поэтому исправлено. Можете ли вы показать нам вывод приведенного выше запроса EXPLAIN, чтобы мы могли точно определить, где находится узкое место?

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

Хотя, если вы можете преобразовать его, условие (при соединении) станет:

    AND datagps.FechaHora < b.FechaHora

После этого добавьте индекс для datagps.FechaHora, и запрос будет быстрым (er).

person Vin-G    schedule 26.09.2009
comment
Всем привет! Vin-G, что-то тут не так, пришлось остановить процесс через более чем 10 - 15 минут при полной загрузке процессора на 100% - person ; 26.09.2009
comment
Может быть, запрос не использует индексы, и вы используете очень большие таблицы? Есть индексы для датагпс.Хора и датагпс.Феча? Можете ли вы объяснить выбор? Также попробуйте ответ rexem ниже, который использует внутренние запросы. - person Vin-G; 26.09.2009
comment
О, подождите, я думаю, что-то не так с условиями, позвольте мне исправить это. - person Vin-G; 26.09.2009

Что вы, вероятно, хотите, так это получить максимум (Fecha, Hora) для сгруппированного набора данных? Это немного сложно сделать с вашими типами столбцов. Вы должны объединить Fecha и Hora в один столбец типа DATETIME. Тогда легко просто ВЫБРАТЬ MAX(FechaHora)... GROUP BY Fichagps.

Это могло бы помочь, если бы вы опубликовали структуру своей таблицы, чтобы понять проблему.

person hurikhan77    schedule 26.09.2009