2009-08-20 2 views
0

Мы используем решение для мониторинга (zabbix). Она хранит данные тенденции (MySQL 5.X), используя таблицу с именем trends_uint со следующей структурой (упрощенный):SQL Query - заменить жестко установленные значения ... (MySQL)

itemid clock  value_avg 
1   1238774400 100 
1   1250773900 70 
1   1250773200 50 

В часы поле хранит даты-времени с использованием значения времени Unix.

Я пытаюсь извлечь отчет, чтобы увидеть потребление контролируемого элемента. Я решил сделать это, выбрав самую старую запись и самую новую запись. Я добился этого, сделав следующее:

SELECT 
(SELECT t.clock FROM trends_uint t WHERE t.itemid = 1 AND t.clock IN (SELECT MIN(t.clock) FROM trends_uint t WHERE t.itemid = 1)) AS minClock, 
(SELECT t.value_avg FROM trends_uint t WHERE t.itemid = 1 AND t.clock IN (SELECT MIN(t.clock) FROM trends_uint t WHERE t.itemid = 1)) AS minValueAvg, 
(SELECT t.clock FROM trends_uint t WHERE t.itemid = 1 AND t.clock IN (SELECT MAX(t.clock) FROM trends_uint t WHERE t.itemid = 1)) AS maxClock, 
(SELECT t.value_avg FROM trends_uint t WHERE t.itemid = 1 AND t.clock IN (SELECT MAX(t.clock) FROM trends_uint t WHERE t.itemid = 1)) AS maxValueAvg, 
(SELECT maxClock - minClock) AS timeGap, 
(SELECT minValueAvg - maxValueAvg) AS valueGap, 
(SELECT timeGap/86400) AS daysGap, 
(SELECT valueGap/daysGap/1024/1024) AS consumeMB 

Моя проблема в том, что у меня есть много серверов, из которых я хочу рассчитать потребление. Я не хочу менять запрос, для которого (изменение itemid).

В системе есть другая таблица (элементы), из которой я могу извлечь элементы, которые мне нужно внести в отчет. Что-то вроде SELECT itemid FROM items WHERE ...

Так что это мой вопрос: вместо использования жестко закодированного элемента itemid можно сделать его «динамическим», например, используя возвращенные коды из другого запроса (например: SELECT ... FROM ... WHERE itemid IN (SELECT itemid FROM items WHERE ...)?

ТИА,

Боб

ответ

1

Похоже, что вы хотите использовать переменные вашего языка программирования или MySQL user-defined, чтобы сохранить выбранный вами идентификатор один раз и повторно использовать его.

Я предполагаю, что вы используете какой-то язык, скажем PHP, для обхода этих вызовов.

Вы можете затем:

  • сделать SELECT, на ItemID, сохранить его в $ Itemid, а затем передать, чтобы ваш ВЫБРАТЬ или
  • использование MySQL пользовательские переменные и сохранить ItemID, с чем-то вроде

    SET @ Itemid = ВЫБРАТЬ ItemID FROM trends_uint WHERE ....

    ВЫБОР .... ГДЕ t.itemid = @itemid ....

+0

Спасибо. Я не был» t clear, но я пытаюсь добиться этого, просто используя функции MySQL (если возможно, предпочтение отдается чистым SQL-запросам). Я сделаю исследование об пользовательских переменных. –

0

Да, это возможно. Тем не менее, это будет БЕСПЛАТНО уменьшать вашу производительность.

Для одного примера, см: http://www.1keydata.com/sql/sql-subquery.html

Если это возможно, следует избегать использования IN ключевого слова.

0
select id, 
min(clock) as minClock, 
max(clock) as maxClock, 
maxClock - minClock as timeGap, 
(timeGap/86400) AS daysGap, 
min(value_avg) as minValueAvg, 
max(value_avg) as maxValueAvg, 
(valueGap/daysGap/1024/1024) AS consumeMB 
from trends_uint 
group by id; 

Это должно делать все сразу.

В дальнейшем, в случае, если вам нужно что-то в виде петли (хотя он смотрит на меня, как это лучше, так как один оператор с «группой по), то ссылка http://dev.mysql.com/doc/refman/5.0/en/flow-control-constructs.html

Смежные вопросы