1
delimiter $$

CREATE TABLE `tbl_locate` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Locating` bit(1) DEFAULT NULL,
  `MainPower` bit(1) DEFAULT NULL,
  `Acc` bit(1) DEFAULT NULL,
  `PowerOff` bit(1) DEFAULT NULL,
  `Alarm` int(11) DEFAULT NULL,
  `Speed` int(11) DEFAULT NULL,
  `Direction` int(11) DEFAULT NULL,
  `Latitude` double DEFAULT NULL,
  `Longitude` double DEFAULT NULL,
  `DateTime` datetime DEFAULT NULL,
  `MainID` int(11) DEFAULT NULL,
  `IOState` int(11) DEFAULT NULL,
  `OilState` int(11) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1$$

SQL 字符串

SELECT * FROM tbl_locate WHERE DateTime=(SELECT MAX(`DateTime`) FROM tbl_locate WHERE MainID=1,2,3)

我想返回主 ID 为 1 或 2 或 3 的最新行的数据,
因此,需要返回 3 行最新的日期时间。
第一行是 id 1 最新日期时间
第二行是 id 2 最新日期时间
第三行是 id 3 最新日期时间

怎么做?

4

4 回答 4

1
SELECT        *
FROM          tbl_locate AS a
INNER JOIN     
(
    SELECT    MainID, Max(DateTime) AS DateTime
    FROM      tbl_locate
    GROUP BY  MainID
) AS b
ON            a.MainID = b.MainID
AND           a.DateTime = b.DateTime
WHERE b.MainID in(1,2,3)

试试这个

于 2013-02-19T21:41:09.933 回答
0

按日期时间排序,并获得前 3 行:
SELECT * FROM tbl_locateORDER BY DateTime LIMIT 3

于 2013-02-19T21:36:41.507 回答
0

这应该有效:

SELECT * 
FROM tbl_locate t
  JOIN (SELECT Max(DateTime) MaxDateTime, MainId
        FROM tbl_Locate
        WHERE MainId IN (1,2,3)
        GROUP BY MainId) t2 
   ON t.MainId = t2.MainId AND t.DateTime = t2.MaxDateTime

这应该会返回 3 行,主 ID 1、2、3 各一行及其对应的 Max(DateTime)。但是,如果存在多个具有相同 DateTime 的行,则它将返回多条记录。

这是小提琴的示例:http ://sqlfiddle.com/#!2/f2c49/1

如果多个记录存在相同的日期,您需要引入一个 RANK 以确保您只为每个 MainId 返回一条记录:

SELECT *
FROM (
SELECT 
   @rowNumber:= IF(@prevRow=t.MainId, @rowNumber:=@rowNumber+1, 1) rank,
  t.* , 
  @prevRow:=t.MainId
FROM tbl_locate t
  JOIN (SELECT 
        Max(DateTime) MaxDateTime, MainId
        FROM tbl_Locate
        WHERE MainId IN (1,2,3)
        GROUP BY MainId) t2 
   ON t.MainId = t2.MainId AND t.DateTime = t2.MaxDateTime
JOIN (SELECT @rowNumber:= 0) t3

 ) t
WHERE rank = 1;

http://sqlfiddle.com/#!2/dce87/2

于 2013-02-19T21:37:14.600 回答
0

试试这个:

SELECT
    T1.*
FROM tbl_locate T1
    LEFT JOIN tbl_locate T2
        ON T1.MainID = T2.MainID
          AND T1.`DateTime` < T2.`DateTime` 
WHERE T2.Id IS NULL
  AND MainID IN (1,2,3)
于 2013-02-19T21:40:30.727 回答