2017-04-20 70 views
2

我有兩個表(在SQL Server數據庫)的最後一個條目的位置如下:MySQL查詢找到一個設備

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,每條記錄有一個日期和地點(< - 設備的位置)。設備可能有多個記錄(至少一個)。

我需要找到在tblDevices中的所有記錄的最新記錄的location每個idDevice一個SQL查詢。

我試着寫了很長一段時間的查詢,但找不到解決方案,因此任何幫助或提示將受到歡迎。

+0

你嘗試過這麼遠嗎?顯示某種努力來嘗試查詢。然後我們可以幫你解決它。同時顯示來自兩個表格的樣本數據。另外,你實際使用的是什麼RDBMS?刪除你沒有使用的東西。 –

+0

另一件事...'的'tblDevices'表和'idDevice VARCHAR(30)'的'tblEnvironmentLog'表,你怎麼能有'idDevice VARCHAR(255)。可能是一些截斷問題。 –

回答

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) 
+0

如何通過'datDate'和'datTime'訂單時,您沒有加入'tblEnvironmentLog'? –

+0

@WEI_DBA糟糕...當我開始編輯時,我沒有看到兩個表格。謝謝。 –

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) 
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