在过去的几个小时里,我一直在摸不着头脑,为查询找到优化,这似乎花费了很多时间:
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);
所以我要查询一组设备,并为每个设备查询最后一个相关事件 请注意, $ account / $ time 是从$ _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
);
答案 0 :(得分:2)
根本不需要Device
表。此外,使用简单的JOIN可以避免IN [子查询]:
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;
此外,您应该使用预准备语句而不是将用户控制的值放入查询中,但这是一个单独的主题。