Запрос SQL - заменить жестко закодированные значения ... (MySQL)

0

Мы используем решение для мониторинга (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 ...

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

ТИА,

Боб

Теги:

3 ответа

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

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

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

Вы можете:

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

    SET @itemid = SELECT itemid FROM trends_uint WHERE....

    SELECT.... WHERE t.itemid = @itemid....

  • 0
    Благодарю. Мне было непонятно, но я пытаюсь добиться этого, просто используя функции 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

Ещё вопросы

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