Мы используем решение для мониторинга (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 ...
)?
ТИА,
Боб
Похоже, что вы хотите использовать либо ваш язык программирования, либо MySQL, определяемый пользователем, чтобы сохранить выбранный вами идентификатор один раз и повторное использование.
Я предполагаю, что вы используете какой-то язык, например PHP, для обхода этих вызовов.
Вы можете:
используйте переменные MySQL, определенные пользователем, и сохраните элемент itemid с чем-то вроде
SET @itemid = SELECT itemid FROM trends_uint WHERE....
SELECT.... WHERE t.itemid = @itemid....
Да, это возможно. Однако это будет БЕСПЛАТНО уменьшать производительность.
Например, см. http://www.1keydata.com/sql/sql-subquery.html
Если возможно, вам следует избегать использования ключевого слова IN
.
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