Запрос SQL - заменить жестко закодированные значения ... (MySQL) - PullRequest
0 голосов
/ 20 августа 2009

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

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 ...)?

ТИА

Bob

Ответы [ 3 ]

1 голос
/ 20 августа 2009

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

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

Вы можете:

  • сделать SELECT для itemid, сохранить его как $ itemid, а затем перейти к вашему SELECT или
  • использовать пользовательские переменные MySQL и сохранить itemid, например

    SET @ itemid = ВЫБРАТЬ itemid ИЗ trend_uint ГДЕ ....

    ВЫБРАТЬ .... ГДЕ t.itemid = @itemid ....

0 голосов
/ 20 августа 2009
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;

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

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

0 голосов
/ 20 августа 2009

Да, это возможно. Тем не менее, это серьезно снизит вашу производительность.

Например, см .: http://www.1keydata.com/sql/sql-subquery.html

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...