Вопрос, связанный с получением самой последней записи из таблицы? - PullRequest
0 голосов
/ 09 февраля 2009

Привет, я не очень хорошо разбираюсь в вопросах. Я сделаю все возможное. Я создаю веб-сайт, и мой вопрос связан с запросами, связанными с сайтом. Это текущий запрос, который у меня есть.

SELECT
  GPS_modem.vehicle_no, 
  vehicle_log.longitude, 
  vehicle_log.latitude, 
  vehicle_log.timestamp
FROM
  vehicle_log,
  GPS_modem
WHERE
  GPS_modem.modem_ID = vehicle_log.modem_ID
ORDER BY 
  timestamp desc

Я хочу отобразить запись с самой последней отметкой времени из таблицы vehicle_log, где modem_ID из таблицы GPS_modem соответствует таблице modem_ID из vehicle_log.

Я пытался использовать DISTINCT, но я не работал. Я получал ошибки, когда пытался использовать функцию MAX. Надеюсь, вы сможете понять мой вопрос, если тогда, пожалуйста, помогите мне. Заранее благодарю.

Ответы [ 6 ]

4 голосов
/ 09 февраля 2009

Вы можете использовать коррелированный подзапрос:

SELECT
  m.vehicle_no, 
  l.longitude, 
  l.latitude, 
  l.timestamp
FROM
  vehicle_log AS l,
  GPS_modem   AS m 
WHERE
  m.modem_ID = l.modem_ID
  AND l.timestamp = (
    SELECT MAX(timestamp) FROM vehicle_log WHERE modem_ID = l.modem_ID
  )

РЕДАКТИРОВАТЬ: В редакции № 1 моего ответа, я видел запрос выше. Тогда что-то заставило меня думать, что я должен изменить это на то, что ниже. Нижеследующее работает, но не является сложным, скорее всего, хуже. Выспавшись на нем, рекомендую против такого подхода. ; -)

SELECT
  m.vehicle_no,
  latest.longitude, 
  latest.latitude, 
  latest.timestamp
FROM
  GPS_modem AS m,
  (
    SELECT
      modem_ID,
      longitude, 
      latitude, 
      timestamp
    FROM
      vehicle_log AS l
    WHERE
      timestamp = (
        SELECT MAX(timestamp) FROM vehicle_log WHERE modem_ID = l.modem_ID
      )
  ) AS latest
WHERE
  m.modem_ID = latest.modem_ID
1 голос
/ 09 февраля 2009

В зависимости от БД,

SELECT TOP 1 GPS_modem.vehicle_no, vehicle_log.longitude, vehicle_log.latitude,  vehicle_log.timestamp from vehicle_log,GPS_modem where GPS_modem.modem_ID = vehicle_log.modem_ID order by timestamp desc

Будет работать на SQL Server.

0 голосов
/ 09 февраля 2009

В Oracle:

SELECT
  GPS_modem.vehicle_no, 
  vehicle_log.longitude, 
  vehicle_log.latitude, 
  vehicle_log.timestamp
FROM
  (
  SELECT v.*, ROW_NUMBER() OVER (PARTITION BY modem_id ORDER BY timespace DESC) AS rn
  ) l, GPS_modem m
WHERE
  l.rn = 1
  AND m.modem_ID = l.modem_ID

В MySQL:

SELECT *
FROM (
   SELECT DISTINCT g.id AS gid, (
     SELECT l.modem_id
     FROM vehicle_log l
     WHERE l.modem_id = g.modem_id
     ORDER BY timestemp DESC
     LIMIT 1
     ) lid
 ), vehicle_log lo, GPS_modem go
WHERE lo.modem_id = lid
  AND go.modem_id = lo.modem_id
0 голосов
/ 09 февраля 2009

Вот пример использования SQL Server. Он использует коррелированный подзапрос с преимуществом выполнения сопоставления с использованием modem_ID, а не совпадением с отметкой времени.

CREATE TABLE #GPS_modem
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    vehicle_no VARCHAR(10)
)

CREATE TABLE #vehicle_log
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    modem_ID    INT,
    longitude   INT,
    latitude    INT,
    [timestamp] DATETIME DEFAULT GETDATE()
)

INSERT INTO #GPS_modem
SELECT 'ABC123' UNION ALL SELECT 'XYZ123'

INSERT INTO #vehicle_log
SELECT 1,234,543,GETDATE()
UNION all
SELECT 2,4342,432234,GETDATE()
UNION all
SELECT 1,4322,432,DATEADD(DAY,-1,GETDATE())
UNION all
SELECT 2,6336,5324,DATEADD(DAY,-1,GETDATE())

SELECT * FROM #GPS_modem
SELECT * FROM #vehicle_log


SELECT
    vehicle_no,
    longitude,
    latitude,
    [timestamp]
FROM 
    #GPS_modem A
        inner join #vehicle_log B on
        A.ID = B.modem_ID
WHERE B.ID IN
(
    SELECT TOP 1 ID
    FROM #vehicle_log
    WHERE modem_ID = A.ID
    ORDER BY [timestamp] DESC 
)

DROP TABLE #GPS_modem
DROP TABLE #vehicle_log

Ура, Джон

0 голосов
/ 09 февраля 2009

Это может быть не лучшим способом.

Но так как вы заказываете результаты, вы можете использовать LIMIT.

SELECT GPS_modem.vehicle_no, vehicle_log.longitude, vehicle_log.latitude, vehicle_log.timestamp from vehicle_log,GPS_modem where GPS_modem.modem_ID = vehicle_log.modem_ID order by timestamp desc LIMIT 1

Существуют и другие решения (возможно, лучшие), но это один из вариантов.

0 голосов
/ 09 февраля 2009

В MySQL вы можете использовать «предел 1» в конце запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...