2009-08-20 5 views
0

Nous utilisons une solution de surveillance (zabbix). Il stocke les données de tendances (MySQL 5.X) à l'aide d'une table appelée trends_uint avec la structure suivante (simplifiée):SQL Query - remplacer les valeurs codées en dur ... (MySQL)

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

Le champ d'horloge stocke des valeurs datetime en utilisant le temps Unix. J'essaie d'extraire un rapport pour voir la consommation d'un élément surveillé. J'ai pensé faire cela en sélectionnant le plus ancien disque et le plus récent disque. Je l'ai réalisé en faisant ce qui suit:

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 

Mon problème est que j'ai beaucoup de serveurs dont je veux calculer la consommation. Je ne veux pas changer la requête pour laquelle (changer l'itemid).

Le système dispose d'une autre table (éléments) à partir de laquelle je pourrais extraire les éléments que je dois mettre dans le rapport. Quelque chose comme SELECT itemid FROM items WHERE ...

Voici donc ma question: au lieu d'utiliser un itemid codé en dur, est-il possible de le rendre "dynamique", en utilisant par exemple les codes retournés d'une autre requête (ex .: SELECT ... FROM ... WHERE itemid IN (SELECT itemid FROM items WHERE ...)?

TIA,

Bob

Répondre

1

Il semble que vous souhaitiez utiliser les variables de votre langage de programmation ou MySQL user-defined pour stocker l'identifiant que vous avez sélectionné une fois et le réutiliser. Je suppose que vous utilisez une sorte de langage, disons PHP, pour entourer ces appels.

Vous pouvez alors:

  • faire un SELECT sur la itemid, l'enregistrer comme itemid $, puis passer à votre SELECT ou
  • utiliser des variables définies par l'utilisateur MySQL et enregistrez le itemid, avec quelque chose comme

    SET @ Itemid = SELECT itemid dE trends_uint OU ....

    SELECT .... Où t.itemid = @itemid ....

+0

Merci. Je n » étais pas t clair, mais j'essaie d'y parvenir en utilisant simplement les fonctionnalités MySQL (préférence aux requêtes SQL pures si possible) .Je ferai une recherche sur les variables définies par l'utilisateur. –

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; 

Cela devrait tous faire en même temps.

À l'avenir, au cas où vous avez besoin quelque chose comme une boucle (mais il me semble que cela vaut mieux en une seule déclaration avec un « groupe par), la référence est http://dev.mysql.com/doc/refman/5.0/en/flow-control-constructs.html