SQL查询 - 替换硬编码值...(MySQL)

问题描述:

我们使用监视解决方案(zabbix)。它存储使用称为trends_uint具有以下结构(简化的)表趋势数据(MySQL的5.X):使用Unix时间SQL查询 - 替换硬编码值...(MySQL)

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

时钟字段存储日期时间值。

我试图提取报告来查看受监视项目的消耗。我认为通过选择最旧的记录和最新的记录来做到这一点。我做到了这一点:

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

TIA,

鲍勃

它看起来像你想要的是使用你的编程语言或MySQL user-defined变量来存储你选择一次的ID并重用它。

我假设你正在使用某种语言,比如PHP,来环绕这些调用。

然后,您可以:

  • 做一个SELECT上的itemid,将其保存为$的itemid,然后传递到您的SELECT或
  • 使用MySQL的用户定义的变量和保存的itemid,喜欢的东西

    SET @的itemid =选择的itemid FROM trends_uint WHERE ....

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

+0

感谢。我没”但我试图用MySQL功能来实现它(如果可能的话,优先选择纯SQL查询),我将对用户定义的变量进行研究。 – 2009-08-20 16:34:42

是的,这是可能的。但是,它会严重降低你的表现。

举一个例子,请参阅: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; 

这应该一次完成所有这些。

在未来,如果你确实需要的东西作为一个循环(虽然它看起来对我来说,这是作为一个单独的语句与一个“GROUP BY更好),参考是http://dev.mysql.com/doc/refman/5.0/en/flow-control-constructs.html