我们有一个数据库,每分钟存储车辆的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)。
我该如何做到这一点?
答案 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。
如果您发布了表结构以了解问题,那可能会有所帮助。