结合两个表的结果具有不同结构

我有两个表:结合两个表的结果具有不同结构

事件

CREATE TABLE IF NOT EXISTS `event` (

`eventId` bigint(20) NOT NULL AUTO_INCREMENT,

`eventTime` bigint(20) NOT NULL COMMENT 'ex: 1431201865000 (epoch is milliseconds)',

`sourceId` bigint(20) NOT NULL COMMENT 'ex: pole-code: 1 = JA005, patrolCarCode: 5000 = D4588',

`plateNumber` varchar(40) COLLATE utf8_unicode_ci NOT NULL COMMENT 'ex: 5849',

`plateGps` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'ex: 0.000000 N 0.000000 E')

ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

来源

CREATE TABLE IF NOT EXISTS `source` (

`sourceId` bigint(20) NOT NULL AUTO_INCREMENT,

`sourceName` varchar(100) COLLATE utf8_unicode_ci NOT NULL COMMENT 'ex: pole-code: JA005, patrolCarCode:D4588',

`sourceSimIp` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'ex: 192.55.44.22',

`sourceGps` varchar(40) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'Only for Fixed source (Poles) ex: 25.110227 N 55.239798 E, 24.993183 N 55.250382 E, 0.000000 N 0.000000 E',

PRIMARY KEY (`sourceId`),

KEY `sourceName` (`sourceName`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

样本数据

INSERT INTO `source` (`sourceId`, `sourceName`, `sourceSimIp`, `sourceGps`) VALUES 

(1, 'Pole 1', '74.200.230.71', '7.8731 N 80.7718 E'),

(2, 'Car 1', '40.214.203.72', '')

INSERT INTO `event` (`eventId`, `eventTime`, `sourceId`, `plateNumber`, `plateGps`)

VALUES

(1, 1498806550534, 1, '1111', null),

(2, 1498806550544, 2, '1111', '7.2936 N 80.6413 E'),

(3, 1498806550554, 2, '1111', '7.9570 N 80.7601 E'),

(4, 1498806550564, 2, '1112', '7.9580 N 80.7601 E'),

(5, 1498806550584, 1, '1111', null),

(6, 1498806550574, 1, '1111', '7.3010 N 80.3872 E')

问:

有两种来源。 1.静态源(POLE CAMERA) 2.动态源(动车CAMERA)

在事件表,如果新条目从静态源的到来,我们已经拥有了GPS值它保存在源表中,所以我们只保存源ID并保持plateGPS字段为空,但对于动态源,我们在源表中没有GPS值,因为源是动态的,并且每个事件具有不同的位置,它们与指向源表的sourceID一起保存在事件表的plateGps字段中(仅供参考)。

现在我需要构造一个查询,其中用户将指定'PlateNumber',我需要通过eventTime按顺序检查我们系统中的所有GPS出现。

一个PlateNumber可以被静态源和动态源检测到,所以我正在寻找动态的方式来从他们两个获得GPS出现。

我能够创建下面的查询,但它不会照顾order by eventTime限制。

select source.sourceGps as 'sourceGps' from source where source.sourceId in (select event.sourceId from event where eventTime >= 1488312001000 and eventTime <= 1513886399000 and event.plateNumber = '1111' and plateGps is null) 

union all

select plateGps as 'sourceGps' from event where eventTime >= 1488312001000 and eventTime <= 1513886399000 and event.plateNumber = '1111' and length(plateGps) > 0

谁能帮助我吗?

回答:

也许你只需要一个left joinorder by

select coalesce(s.sourceGps, e.plateGps) as sourceGps, 

from event e left join

source s

on s.sourceId = e.sourceId

where e.eventTime >= 1488312001000 and e.eventTime <= 1513886399000 and

e.plateNumber = '5327'

order by e.eventTime;

以上是 结合两个表的结果具有不同结构 的全部内容, 来源链接: utcz.com/qa/263848.html

回到顶部