MySQL只返回上次日期/时间记录

时间:2009-09-26 09:38:52

标签: sql mysql date time

我们有一个数据库,每分钟存储车辆的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;

我需要得到相同的结果,但是我需要最新的记录而不是旧记录 (最后的datagps.Fecha / datagps.Hora)。

我该如何做到这一点?

4 个答案:

答案 0 :(得分:2)

ORDER BY datagps.Fecha DESC, datagps.Hora DESC LIMIT 1添加到您的查询中。

答案 1 :(得分:1)

我不确定你为什么会遇到任何问题,因为Lex的答案似乎很好。

我会开始在你的查询中放置ORDER BY,所以它将它们放在一个顺序中,当它显示你想要的记录作为列表中的第一个,然后添加LIMIT。

如果您想要最新的,那么以下内容应该足够好了:

ORDER BY datagps.Fecha DESC, datagps.Hora DESC

如果你只是想要最近添加到数据库中的记录(不管日期/时间字段),那么你可以(假设你在datagps表中有一个自动增量主键(我假设它叫做dataID)对于这个例子)):

ORDER BY datagps.dataID DESC

如果这些没有显示您想要的数据 - 那么您的示例中缺少某些内容(可能数据类型不是DATETIME字段? - 如果不是 - 那么可能是CONVERT在ORDERing之前将它们从当前类型更改BY会是一个好主意)

编辑: 我已经看过截图,但我对这个问题仍然感到困惑。这似乎是按顺序显示一切。您是否暗示有超过5条记录?你有多少期待?

答案 2 :(得分:1)

您的意思是:对于返回的每条记录,您希望表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;

类似问题here仅表示使用外部联接。

编辑(再次): 条件错了所以纠正它。你能告诉我们上面的EXPLAIN查询的输出,以便我们可以确定瓶颈的位置吗?

正如hurikhan77所说,如果你可以将两个列转换为单个日期时间字段会更好 - 尽管我猜你的情况不可能(因为你的数据库已被使用?)< / p>

虽然如果你可以转换它,条件(在连接上)将变为:

    AND datagps.FechaHora < b.FechaHora

之后,为datagps.FechaHora添加一个索引,查询速度很快(呃)。

答案 3 :(得分:0)

您可能想要的是获得每个分组数据集的最大值(Fecha,Hora)?使用列类型实现这一点有点复杂。您应该将Fecha和Hora组合成一个DATETIME类型的列。然后很容易就是SELECT MAX(FechaHora)...... GROUP BY Fichagps。

如果您发布了表结构以了解问题,那可能会有所帮助。