我用 ZABBIT 做流量統計用 SQL 指令
SELECT items.itemid, hosts.hostid, hosts.name, items.name
from items ,hosts
where items.hostid=hosts.hostid
AND items.name LIKE '% network traffic on ens%'
與
SELECT SUM(`value`) FROM history_uint
WHERE itemid = 32160 AND
clock >= UNIX_TIMESTAMP('2019-10-20 00:00:00') AND
clock <= UNIX_TIMESTAMP('2019-11-20 00:00:00');
其中 itemid = 32160 就是上面 items.itemid 取到的 ....
想用一行指令處理 ....有沒有DBA 能幫忙一下
這邊是要每個 itemid 列出來 2019-10-20 00:00:00 - 2019-11-20 00:00:00 的流量統計
試了老半天沒能成功
成功了 紀錄一下 .... 原來放在 SELECT 裡面就會 foreach itemid
SELECT
(SELECT SUM(history_uint.value) FROM history_uint
WHERE history_uint.itemid = items.itemid AND
history_uint.clock >= UNIX_TIMESTAMP('2019-10-20 00:00:00') AND
history_uint.clock <= UNIX_TIMESTAMP('2019-11-20 00:00:00'))
AS flow
, hosts.name, items.name AS interface_traffic
from items ,hosts
where items.hostid=hosts.hostid
AND items.name LIKE '% network traffic on ens%'
SELECT SUM(value
) FROM history_uint
WHERE itemid = (SELECT items.itemid from items ,hosts where items.hostid=hosts.hostid AND items.name LIKE '% network traffic on ens%')
AND clock >= UNIX_TIMESTAMP('2019-10-20 00:00:00') AND
clock <= UNIX_TIMESTAMP('2019-11-20 00:00:00');
查詢發生錯誤 (1242): Subquery returns more than 1 row
結果如下圖
那就加上一個 limit 1 吧。
SELECT SUM(value) FROM history_uint
WHERE itemid = (SELECT items.itemid from items ,hosts where items.hostid=hosts.hostid AND items.name LIKE '% network traffic on ens%' limit 1)
AND clock >= UNIX_TIMESTAMP('2019-10-20 00:00:00') AND
clock <= UNIX_TIMESTAMP('2019-11-20 00:00:00');
斯斯有二種,這題解法有三種,此其一。
加個 limit 1 ?
那不是只取第一個 , 那第二個 ? 第三個 ? ......
是希望 每個 itemid 都列出來
第一個就想到放 where 但是不成功 , 這才POST 文求救的
昨天就是這卡關卡很久 .... 腦經轉不過來 ....
所以最後放到 select 才成功的
感謝您
【其中 itemid = 32160 就是上面 items.itemid 取到的 】
您既然說 32160 是取到的,那當然是只有一個 32160 了,除非您的描述和您的需求不一致?或者,我誤解了?
否則,若是很多個 32160 , 那改成如下試看看
SELECT SUM(value) FROM history_uint
WHERE itemid in (SELECT items.itemid from items ,hosts where items.hostid=hosts.hostid AND items.name LIKE '% network traffic on ens%')
AND clock >= UNIX_TIMESTAMP('2019-10-20 00:00:00') AND
clock <= UNIX_TIMESTAMP('2019-11-20 00:00:00');
不過,既然您成功了,那就好了呀。
group by
純討論......
WHERE itemid in 這個方式昨日也有試過 出來的不是每個 itemid ...