2016-11-17 53 views
1

我有2個表要使用,我希望顯示結果取決於Table2中的所有者在table1 ='ownerA'中的最近數據: 表1:MySQL顯示來自表2中最近數據的2個表中的行

# id, name,   owner 
________________________________________________ 
    19782, device1,  ownerA 
    19783, device8,  ownerB 
    19784, device2,  ownerA 
    19785, device3,  ownerA 

表2:

# nasid, sim, timestamp 
_______________________________________ 
19782, 0, 2015-12-08 15:34:27 
19782, 0, 2015-12-08 15:34:33 
19772, 0, 2015-12-08 15:34:39 
19752, 0, 2015-12-08 15:34:45 
19783, 0, 2015-12-08 15:34:50 
19712, 0, 2015-12-08 15:34:56 
19783, 0, 2015-12-08 15:35:02 
19782, 0, 2015-12-08 15:35:07 
19784, 0, 2015-12-08 15:35:13 
19784, 0, 2015-12-08 15:35:20 

我想在輸出得到什麼:

# name, nasid, sim,  timestamp 
_______________________________________ 
device8, 19783, 0, 2015-12-08 15:35:02 
device1, 19782, 0, 2015-12-08 15:35:07 
device2, 19784, 0, 2015-12-08 15:35:20 

這是我試過了,:

select nasid, sim, MAX(timestamp) 
from Table1 T1,Table2 T2 
where 
Table1.owner='ownerA' 
and 
T2.timestamp = (SELECT MAX(T2_2.timestamp) 
        FROM Table2 T2_2 
        WHERE T2.sim=T2_2.sim) 

這是我SHOW CREATE: 表1:

CREATE TABLE `Table1` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(64) COLLATE latin1_general_ci DEFAULT NULL, 
    `owner` varchar(128) COLLATE latin1_general_ci DEFAULT '', 
    UNIQUE KEY `name` (`name`), 
    KEY `id` (`id`), 
    KEY `owner` (`owner`), 
) ENGINE=InnoDB AUTO_INCREMENT=26696 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci 

表2:

CREATE TABLE `Table2` (
    `nasid` int(11) DEFAULT NULL, 
    `sim` char(20) COLLATE latin1_general_ci DEFAULT NULL, 
    `timestamp` datetime DEFAULT NULL, 
    KEY `nasid` (`nasid`), 
    KEY `timestamp` (`timestamp`), 
    KEY `sim` (`sim`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci 
+0

你想最近的時間戳或全部? – WillardSolutions

+0

@EatPeanutButter,每個設備的最新版本 – user2997418

+0

爲什麼device8在您的預期輸出中,如果擁有者是'B'?你的where子句擁有ownerA? – xQbert

回答

1

一般來說,我生成的最高值數據集然後將唯一密鑰簡單地加入到包含我們需要的其他數據的基本集合中。

SELECT T1.name, T2.nasid, T2.sim, T2.timestamp 
FROM Table1 T1 
INNER JOIN table2 T2 
on T1.ID = T2.nasid 
INNER JOIN (SELECT max(timestamp) mt, nasid 
      FROM table2 
      GROUP BY nasid) A 
    on A.MT = T2.TimeStamp 
    and A.Nasid = T2.Nasid 
WHERE T1.Owner = 'ownerA' 

好讓我們回到原來的查詢......

我認爲你有錯有SIM應NASID。因爲模擬似乎不是桌子的關鍵。只有基於提供的數據的nasid和時間戳纔會生成唯一的密鑰。並且你錯過了t1和t2之間的連接。

select name, nasid, sim, timestamp 
from Table1 T1,Table2 T2 
where Table1.owner='ownerA' 
and T1.Id = t2.nasid 
and T2.timestamp = (SELECT MAX(T2_2.timestamp) 
        FROM Table2 T2_2 
        WHERE T2.nasid=T2_2.nasid) 
+0

它可以工作,但需要很長時間。我的桌子真的很大。我認爲很多內連接使它有點慢 – user2997418

+0

消除where子句你會得到結果嗎?如果是這樣的話,我可能在'ownerA'上錯了。 (它是'OwnerA') – xQbert

+0

你在T1.Owner,T1.Nasid和T2.Timestamp和Nasid上有索引嗎? – xQbert

0

後很長一段時間,這是什麼使得它更快:

SELECT name, nasid, sim, max(timestamp) 
FROM Table1, Table2 
WHERE Owner = 'OwnerA' 
and id = nasid 
GROUP BY nasid 
相關問題