2009-08-20 3 views
0

監視ソリューション(zabbix)を使用します。 Unixの時間を使用してSQLクエリ - ハードコードされた値を置換...(MySQL)

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

クロックフィールド格納日時値:これは傾向(簡体字)以下の構造を有するtrends_uintと呼ばれるテーブルを使用してデータ(MySQLの5.X)を格納します。

私は、監視対象の消費量を見るためにレポートを抽出しようとしています。最も古いレコードと最新のレコードを選択してこれを行うと思った。私は次のことを達成しました:

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 

私の問題は、消費量を計算したいロットのサーバーがあることです。私はどちらが1つ(itemidを変更する)のクエリを変更したくないです。

システムには、レポートに入れる必要があるアイテムを抽出するための別のテーブル(アイテム)があります。 SELECT itemid FROM items WHERE ...

のようなものは、これが私の質問です:代わりにハードコードされたアイテムIDを使用しての、それは別のクエリ(例:SELECT ... FROM ... WHERE itemid IN (SELECT itemid FROM items WHERE ...)から返されるコードを使用して、インスタンスのために、それは「ダイナミック」にすることができますか?

TIA、

ボブ

答えて

1

プログラミング言語やMySQL user-defined変数を使用して、一度選択したIDを保存して再利用することが望ましいようです。

私はこれらの呼び出しを包むために、PHPなどの何らかの言語を使用していると仮定しています。

その後、することができます:

  • は、itemidの上でSELECTを行う$アイテムIDとして保存した後、あなたのSELECTまたは
  • MySQLユーザ定義の変数を使用してアイテムIDを保存するに渡しますt.itemid = @itemid SELECT ....

    trends_uint FROMアイテムIDを選択=アイテムID @ SET

    のようなもの....

+0

感謝です。私は「wasn私はMySQLの機能(可能であれば純粋なSQLクエリに優先)を使用してそれを達成しようとしています。私はユーザ定義の変数について研究します。 –

0

はい、それが可能です。ただし、パフォーマンスが大幅に低下します。 1たとえば

、以下を参照してください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

関連する問題