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

标签 mysql sql

我有两个表:

事件

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.动态源(MOVING CAR CAMERA)

在事件表中,如果新条目来自静态源,我们已经将其 GPS 值保存在源表中,因此我们仅保存源 ID 并将 PlateGPS 字段保留为空,但对于动态源,我们没有 GPS 值在源表中,因为源是动态的,每个事件都有不同的位置,该位置与指向源表的源 Id 一起保存在事件表的 PlateGps 字段中(仅供引用)。

现在我需要构建一个查询,用户将在其中指定“PlateNumber”,并且我需要按事件时间顺序检查系统中所有 GPS 出现情况。

一个车牌号可以通过静态源和动态源检测到,因此我正在寻找动态方法来从它们两者中获取 GPS 事件。

我能够创建以下查询,但它不考虑按事件时间排序的限制。

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 

有人可以帮我吗?

最佳答案

也许您只需要一个带有 order byleft join:

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;

关于mysql - 合并两个具有不同结构的表的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47869914/

相关文章:

mysql - 具有父类(super class)型表的其他 JOIN 结果的 JOIN 表

PHP While 循环未遍历 MySQL 数据库中的所有选定记录

php - 如何防止 PDO 错误上的密码转储

php - DataTable 格式化表中的日期时间列

MySQL 构造查询

mysql - 仅当表中不存在时才将表单中的值插入到我的数据库表中

mysql - 如何使用mysql的sum()函数计算每一行的总和?

mysql - 如何连接 SQL 表

mysql - 如何首先获取订单最多的供应商列表

mysql - 如果其他行具有相同属性且日期 > 1 天,则 sql 插入