2017-12-18 216 views
0

我有兩個表:結合兩個表的結果具有不同結構

事件

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 

誰能幫助我嗎?

+2

我認爲樣本數據和預期的結果將真正幫助。 –

+0

我已經上傳了示例數據。 –

回答

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; 
+0

你的查詢似乎有一些錯別字,任何我會嘗試和更新你,如果它適用於我。我已經更新它與MySQL運行。 選擇聚結(s.sourceGps,e.plateGps)從事件e sourceGps 左連接源極s 上s.sourceId = e.sourceId 其中e.eventTime> = 1488312001000和e.eventTime <= 1513886399000和 Ë .plateNumber ='5327' order by e.eventTime; –

+0

您的查詢正在爲plateGps列值返回空字符串,其中源是動態的。 –

相關問題