2016-02-09 74 views
0


我一直在抓我的頭在過去的時間找到這似乎耗費了大量的時間,查詢優化優化查詢:在MySQL

SELECT d.deviceID ,e.latitude, e.longitude,MAX(e.timestamp) as timestamp 
FROM Device as d INNER JOIN EventData as e ON d.deviceID=e.deviceID 
WHERE e.accountID='$account' AND e.timestamp<=$time AND (e.deviceID IN (SELECT deviceID FROM DeviceList WHERE accountID='$account')) 
GROUP BY (e.deviceID); 

所以我查詢了一套的設備和每個設備的最後一個相關事件。
注意$帳戶/ $時間是從$ _ POST獲得變量。
編輯:表結構:

CREATE TABLE IF NOT EXISTS `Device` (
     `deviceID` varchar(32) NOT NULL, 
     `equipmentType` varchar(40) DEFAULT NULL, 
     `description` varchar(128) CHARACTER SET utf8 DEFAULT NULL 

); 
CREATE TABLE IF NOT EXISTS `DeviceList` (
    `accountID` varchar(32) NOT NULL, 
    `groupID` varchar(32) NOT NULL, 
    `deviceID` varchar(32) NOT NULL, 
); 

CREATE TABLE IF NOT EXISTS `EventData` (
    `accountID` varchar(32) NOT NULL, 
    `deviceID` varchar(32) NOT NULL, 
    `timestamp` int(10) unsigned NOT NULL, 
    `statusCode` int(10) unsigned NOT NULL, 
    `latitude` double DEFAULT NULL, 
    `longitude` double DEFAULT NULL, 
    `gpsAge` int(10) unsigned DEFAULT NULL, 
    `speedKPH` double DEFAULT NULL 
); 
+4

你有沒有對查詢做過「解釋」? – Derek

+1

顯示錶結構 –

+0

@OliverQueen我跑它,它示出了3行0:{0: 「1」,1: 「初級」,2: 「d」,3: 「ALL」,4:空,5:空,6:空,7:空,8: 「498」,...} 1:{0: 「1」,1: 「初級」,2: 「E」,3: 「REF」,4: 「初級」 ,5: 「初級」,6: 「68」,...} 2:{0: 「2」,1: 「DEPENDENT SUBQUERY」,2: 「DEVICELIST」,3: 「REF」,4: 「初級」, 5:「PRIMARY」 –

回答

2

你不需要Device表都沒有。而且,IN [子查詢],可避免用一個簡單的JOIN:

SELECT 
    e.eviceID, 
    e.atitude, 
    e.ongitude, 
    MAX(e.timestamp) AS timestamp 
FROM EventData e 
JOIN DeviceList d 
    ON e.deviceID = d.deviceID 
WHERE e.deviceID = :account 
    AND e.timestamp <= :time 
GROUP BY deviceID; 

此外,你應該用準備好的語句,而不是將用戶控制值到一個查詢,但是這是一個獨立的主題。

+0

如何在查詢的這一部分包含/因子:AND(e.deviceID IN(SELECT deviceID FROM DeviceList WHERE accountID ='$ account')) GROUP BY(e.deviceID);' ? –

+0

@cale_b - 夠好的。我假定'DeviceList'和'EventData'都具有相同的'deviceID'值,但情況可能並非如此。無論哪種方式,「Devices」表在這裏實際上並不提供價值。 –

+0

感謝回覆@ mr-llama,但是由於存儲了一些信息,我將需要Device表。我猜問題是查詢獲取EventData的所有行,然後應用MAX聚合,是否有任何獲取每個設備的最後一個事件而沒有獲取所有行的方法(請注意,EventData具有大量的數據每個設備) –