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行を返す必要があります。
1 行目は id 1 最新日時
2 行目は id 2 最新日時
3 行目は 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

これを試して:

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 に答える
0

DateTimeで並べ替え、最初の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

これにより、メイン ID 1、2、3 に対応する Max(DateTime) を含む 3 つの行が返されます。ただし、同じ DateTime の行が複数存在する場合は、複数のレコードが返されます。

サンプルのフィドルは次のとおりです: http://sqlfiddle.com/#!2/f2c49/1

同じ日付の複数のレコードが存在する場合は、RANK を導入して、MainId ごとに 1 つのレコードのみを返すようにする必要があります。

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 に答える