MySQL - 为每个设备选择最后一行的查询

时间:2014-07-18 13:34:52

标签: mysql sql relational-database greatest-n-per-group

我的数据库上有2个表:

CREATE TABLE IF NOT EXISTS `location` (
  `code` int(11) NOT NULL AUTO_INCREMENT,
  `IMEI` varchar(15) NOT NULL,
  `latitude` decimal(10,6) NOT NULL,
  `longitude` decimal(10,6) NOT NULL,
  `speed` tinyint(3) unsigned NOT NULL,
  `course` smallint(6) NOT NULL,
  `satellites` tinyint(3) unsigned NOT NULL,
  `datetime` datetime NOT NULL,
  `rt_dif` tinyint(1) NOT NULL,
  `pos_notpos` tinyint(1) NOT NULL,
  `MCC` smallint(5) unsigned NOT NULL,
  `MNC` smallint(5) unsigned NOT NULL,
  `LAC` smallint(5) unsigned NOT NULL,
  `CELL_ID` mediumint(8) unsigned NOT NULL,
  PRIMARY KEY (`code`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2323 ;

CREATE TABLE IF NOT EXISTS `devices` (
  `code` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `IMEI` varchar(15) NOT NULL,
  `client` int(11) NOT NULL,
  `model` varchar(50) NOT NULL,
  PRIMARY KEY (`code`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

我有属于不同客户端的设备,我想选择给定客户端的每个设备的最后location行。位置消息可以是任何订单,可以全部加扰,或者最后1000个可以来自同一设备。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

这是一种方式......尽管使用coorlative子查询的速度更快。

SELECT D.*, L.*
FROM Devices D
LEFT JOIN Location L
 on D.IMEI = L.IMEI
INNER JOIN (Select max(Code) mCode, IMEI From Location group by IMEI) X  
 on D.IMEI = X.IMEI  
and D.Code = X.mCode

意图:

  • 返回所有设备及其最新位置(如果存在)。
  • OUTER JOIN设备到位,以便我们获得所有设备
  • INNER JOIN到每个设备的最近位置的子集。这个加入 有效地消除了历史位置。

我的理解是你希望“Last”由Code字段确定的位置,记录每个设备。简单地说,您想知道系统中每个设备的最后报告位置;没有历史。

为了实现这一点,我假设您只关心设备表中设备的位置记录。因此,无论是否报告了最后一个位置,我们都会按照我们的要求开始使用设备。

需要为max(代码)设置别名,因为列名不是代码。