Объединить результаты двух таблиц, имеющих разную структуру

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. Статический источник (ПОЛЮСНАЯ КАМЕРА) 2. Динамический источник (ДВИЖУЩАЯ АВТОМОБИЛЬНАЯ КАМЕРА)

В таблице событий, если новая запись поступает из статического источника, у нас уже есть значение GPS для сохранения в исходной таблице, поэтому мы сохраняем только исходный идентификатор и сохраняем поле plateGPS пустым, но для динамического источника у нас нет значения GPS в исходной таблице потому что источник является динамическим, и каждое событие имеет другое местоположение, которое сохраняется в поле tableGps таблицы событий вместе с идентификатором источника, указывающим на исходную таблицу (только для справки).

Теперь мне нужно построить запрос, в котором пользователь будет указывать "PlateNumber", и мне нужно проверить все его вхождения GPS в нашей системе в соответствии с eventTime.

Один PlateNumber может быть обнаружен статическим источником и динамическим источником, поэтому я ищу динамический способ получения GPS-сообщений от обоих из них.

Я смог создать ниже запрос, но он не заботится о порядке ограничения 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 

Может ли кто-нибудь помочь мне в этом?

Теги:

1 ответ

0
Лучший ответ

Возможно, вам просто нужно left join с order 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. выберите coalesce (s.sourceGps, e.plateGps) в качестве sourceGps из события e оставьте источник соединения s на s.sourceId = e.sourceId, где e.eventTime> = 1488312001000 и e.eventTime <= 1513886399000 и e.plateNumber = '5327' заказ по e.eventTime;
  • 0
    Ваш запрос возвращает пустую строку для значения столбца plateGps, где источник является динамическим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню