MySQL查询以查找设备最后一个条目的位置

时间:2017-04-20 13:58:21

标签: mysql sql database

我有两个表(在SQL Server数据库中),如下所示:

create table tblDevices(
idDevice varchar(255) not null,
(...)
primary key(idGUID));

create table tblEnvironmentLog(
ID int not null auto_increment,
idDevice varchar(30) not null,
txtLocation    varchar(255),
datDate    date,
datTime    time,
primary key(ID));

tblEnvironmentLog中的每个事件都属于tblDevice中的设备,每个记录都有一个日期和位置(< - 设备的位置)。设备可能有多个记录(至少一个)。

我需要一个SQL查询,在idDevice中查找其所有记录中最新记录的tblDevices中的每个location

我已经尝试长时间编写查询,但找不到解决方案,所以欢迎任何帮助或提示。

3 个答案:

答案 0 :(得分:0)

因此,您基本上希望获得与每个设备的最新日期/时间相对应的行。您已经指定了MySQL和SQL Server。这适用于SQL Server。

SELECT *
FROM tblDevices t1
    INNER JOIN tblEnvironmentLog t2 
        ON t1.idDevice = t2.idDevice
WHERE t2.ID = (SELECT TOP 1 t3.ID 
               FROM tblEnvironmentLog t3 
               WHERE t2.idDevice = t3.idDevice 
               ORDER BY t3.datDate DESC, t3.datTime DESC)

答案 1 :(得分:0)

你需要这样的东西 -

SELECT t1.*, t2.datDate, t2.datTime
FROM tblDevices t1
JOIN tblEnvironmentLog t2 on t1.idDevice = t2.idDevice
WHERE t2.id in ( SELECT MAX(ID) FROM tblEnvironmentLog GROUP BY idDevice)

答案 2 :(得分:0)

尝试如下查询。如果您需要更好地了解如何正确添加单个组件的日期时间,see this answer

<强>说明: 我们使用内部查询(作为E)来查找每idDevice的最大日期时间,然后将其加入tblDevices(作为D)以及tblEnvironmentLog(作为E2)以获取期望的结果。

<强>查询

select 
DISTINCT -- this is needed as many result pair may come up with same values
D.iDDevice, E2.Location
from tblDevices D left join
(
Select 
idDevice, 
max( cast(datDate as datetime)+cast (datTime as dattime)) as dt 
from tblEnvironmentLog  
group by idDevice) E 
on D.idDevice =E.idDevice 
left join tblEnvironmentLog E2 on E.idDevice=E2.idDevice and 
cast(E2.datDate as datetime)+cast(E2.datTime as datetime)=E.dt