У меня есть SELECT, который проверяет состояние активных аварийных сигналов (icinga). Этот выбор объединяет разные таблицы и пока здесь все ок. В результате я имею в качестве значения / столбца также object_id. Я хотел бы добавить столбец к этому выбору, который мог бы быть пустым или нет, потому что, ища этот 'object_id' в другой таблице, я мог получить значение или нет. Эта таблица аксессуаров имеет: object_id
, varname
, varvalue
. Итак, т.е. мой SELECT возвращает эти значения:
`name`, `object_id`, `status`
`Hello`, `123456`, `OK`
Я бы добавил столбец City
, который должен сравниваться с таблицей, имеющей:
`object_id`, `varname`, `varvalue`
`123456`, `city`, `Rome`
`123456`, `lake`, `Garda`
`789789`, `city`, `Milano`
Так что если вторая таблица имеет object_id
= 123456
И city
= Rome
результат должен быть:
`name`, `object_id`, `status`, `city`
`Hello`, `123456`, `OK`, `Rome`
В противном случае результат должен быть:
`Hello`, `123456`, `OK`, `UNKNOWN`
Как это сделать?
Надеюсь, я хорошо это объяснил: -)
Спасибо!
* РЕДАКТИРОВАТЬ *
Лучше объяснить с помощью реальный пример. Мой запрос на самом деле выглядит следующим образом:
select icinga_objects.object_id, icinga_objects.name1 as host_name, icinga_objects.name2 as ServiceName, "service" as Type, icinga_servicestatus.last_check as LastCheckTime, icinga_servicestatus.last_hard_state_change as LastStateChange, TIMEDIFF(now(), icinga_servicestatus.last_hard_state_change) AS SinceTime,
CASE
WHEN icinga_servicestatus.current_state = 0 THEN '0'
WHEN icinga_servicestatus.current_state = 1 THEN '2'
WHEN icinga_servicestatus.current_state = 2 THEN '3'
ELSE '3'
END AS state
FROM icinga_objects, icinga_servicestatus, icinga_services WHERE icinga_servicestatus.service_object_id IN
(SELECT service_object_id FROM icinga_services WHERE icinga_services.host_object_id IN
(SELECT host_object_id FROM icinga_hostgroup_members WHERE hostgroup_id IN
(SELECT hostgroup_id FROM icinga_hostgroups WHERE alias = 'MY-HOSTGROUP-TO-FILTER')
)
)
AND icinga_servicestatus.service_object_id NOT IN
(SELECT service_object_id FROM icinga_services WHERE icinga_services.service_object_id IN (
SELECT object_id FROM icinga_objects WHERE icinga_objects.is_active = 1 AND icinga_objects.object_id IN
(SELECT object_id FROM icinga_customvariables WHERE varvalue = '8x5')
)
)
AND icinga_servicestatus.last_check > NOW() - INTERVAL 3 HOUR
AND icinga_servicestatus.state_type = 1
AND icinga_servicestatus.scheduled_downtime_depth = 0
AND icinga_objects.object_id = icinga_services.service_object_id
AND icinga_servicestatus.service_object_id = icinga_services.service_object_id
AND icinga_servicestatus.current_state = 2
AND icinga_servicestatus.problem_has_been_acknowledged = 0
Это дает мне результат, например:
`object_id`, `host_name`, `ServiceName`, `Type`, `LastCheckTime`, `LastStateChange`, `SinceTime`, `State`
`123456`, `myHostName`, `myServiceName`, `service`, `2020-04-29 17:19:21`, `2020-04-28 14:50:27`, `26:32:51`, `3`
Здесь я хотел бы добавить столбец. Итак, теперь, если я найду object_id
в icinga_customvariables
, я смогу найти записи или нет. Например, при поиске object_id
= 123456
у меня есть 4 записи, но ТОЛЬКО одна, имеющая varname
= NAME_IM_SEARCHING
, поэтому мне нужно добавить к приведенному выше результату соответствующий varvalue
поиск icinga_customvariables
. * 1047. * = '123456' И varname
= NAME_IM_SEARCHING
. Если результатов НЕТ, то добавленный столбец должен быть UNKNOWN
, в противном случае добавленный столбец должен быть = icinga_customvariables
. varvalue
.
Как его добавить? : -)