iT邦幫忙

0

MYSQL 的 SQL CMD 請教

我用 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%'

1 個回答

0
ckp6250
iT邦新手 2 級 ‧ 2019-11-25 21:45:27

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');

看更多先前的回應...收起先前的回應...
echochio iT邦高手 1 級 ‧ 2019-11-25 22:08:51 檢舉

查詢發生錯誤 (1242): Subquery returns more than 1 row

結果如下圖
https://ithelp.ithome.com.tw/upload/images/20191125/20110611Dt2gf2iEm6.png

ckp6250 iT邦新手 2 級 ‧ 2019-11-26 05:00:56 檢舉

那就加上一個 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');

斯斯有二種,這題解法有三種,此其一。

echochio iT邦高手 1 級 ‧ 2019-11-26 09:59:43 檢舉

加個 limit 1 ?
那不是只取第一個 , 那第二個 ? 第三個 ? ......
是希望 每個 itemid 都列出來
第一個就想到放 where 但是不成功 , 這才POST 文求救的
昨天就是這卡關卡很久 .... 腦經轉不過來 ....
所以最後放到 select 才成功的
感謝您

ckp6250 iT邦新手 2 級 ‧ 2019-11-26 10:10:01 檢舉

  【其中 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

echochio iT邦高手 1 級 ‧ 2019-11-26 15:11:53 檢舉

純討論......
WHERE itemid in 這個方式昨日也有試過 出來的不是每個 itemid ...

https://ithelp.ithome.com.tw/upload/images/20191126/20110611jXRVpdgsod.png

我要發表回答

立即登入回答