【问题标题】:MySQL to return only last date / time recordMySQL仅返回最后一个日期/时间记录
【发布时间】:2009-09-26 09:38:52
【问题描述】:

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

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

我怎样才能做到这一点?

【问题讨论】:

    标签: sql mysql date time


    【解决方案1】:

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

    【讨论】:

    • 感谢您的帮助!...但是不,这样做是为了我得到的结果,但没有带来最新的记录。换句话说,这个查询带回了 5 辆车的列表,您的建议按日期和时间列出的顺序可以,但是日期和时间是这些车辆的第一条记录(例如:2007-07-26),我需要最近的。我认为解决方案在 WHERE 中,或者使用 max(datagps.Fecha) 或类似的东西,而不是“order by”......建议?我需要提取最新记录的记录
    • 我想我不明白你的意思。能举个例子吗?
    • 我认为你只需要将 DESC 更改为 ASC。
    【解决方案2】:

    我不确定您为什么对此有任何问题,因为 Lex 的答案似乎不错。

    我会开始将 ORDER BY's 放入您的查询中,以便将它们按顺序排列,当它显示您想要的记录作为列表中的第一个时,然后添加 LIMIT。

    如果你想要最新的,那么以下应该就足够了:

    ORDER BY datagps.Fecha DESC, datagps.Hora DESC
    

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

    ORDER BY datagps.dataID DESC
    

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

    编辑: 我已经看到了屏幕截图,但我对问题仍然存在感到困惑。这似乎正在按顺序显示所有内容。您是否暗示有超过 5 条记录?你期待多少?

    【讨论】:

    • 让我解释一下:我期待5条记录,但是,例如:第一条记录,Ficha“SKODA”,日期是2009-09-15,即第一次车辆报告的日期,我需要的是今天 2009-09-26 的报告。换句话说,它显示了第一条记录的结果,我需要最后一条记录。
    【解决方案3】:

    您的意思是:对于返回的每条记录,您希望数据gps 表中的一行在结果中附加最新的日期和时间?如果是这样,怎么样:

    # 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 所说,如果您可以将两列都转换为单个日期时间字段会更好 - 尽管我猜这对于您的情况是不可能的(因为您的数据库已经被使用?)

    如果你可以转换它,条件(在连接上)会变成:

        AND datagps.FechaHora < b.FechaHora
    

    之后,为 datagps.FechaHora 添加索引,查询会很快(呃)。

    【讨论】:

    • 大家好! Vin-G,这里出了点问题,我不得不在 10 到 15 分钟后停止进程,处理器一直处于 100% 状态
    • 可能是查询没有使用索引,而您使用的是非常大的表? datagps.Hora 和 datagps.Fecha 有索引吗?你能解释一下选择吗?还可以尝试下面使用内部查询的 rexem 的答案。
    • 哦等等,我觉得条件有问题,让我更正一下。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 2013-05-09
      • 2019-09-13
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多