2014-01-30 51 views
0

我知道我錯過了一些東西,我嘗試了幾種不同的方法,但我忽略了(或者太努力)。有人可以告訴我在這個SQL中我錯了嗎?SQL JOIN計數和SUM問題

SELECT id, 
    COUNT(id) AS dupBlocks 
FROM tbl_duplicates8 INNER JOIN (
     tbl_accounts8, 
     tbl_delaccounts, 
     tbl_bad_bots, 
     tbl_log, 
     tbl_ipban, 
     tbl_ipban8 
    ) ON (
     tbl_accounts8.SUM(num_attacks) AND 
     tbl_delaccounts.SUM(noattacks) AND 
     tbl_bad_bots.COUNT(id) AND 
     tbl_log.COUNT(id) AND 
     tbl_ipban.COUNT(txt_ip) AND 
     tbl_ipban8.COUNT(ip) 
    ); 

我沒有注意到這個MySQL Join two tables count and sum from second table,但它返回時返回null。

任何幫助,將不勝感激。

爲了進一步爲更好的回答這個問題,這是我目前在做什麼:

$statsresults['newIPBan'] = $db->query("SELECT COUNT(ip) AS newIPBan FROM tbl_ipban8;"); 
$statsresults['oldIPBan'] = $db->query("SELECT COUNT(txt_ip) AS oldIPBan FROM tbl_ipban;"); 
$statsresults['log_blocks'] = $db->query("SELECT COUNT(id) AS logBlocks FROM tbl_log;"); 
$statsresults['badbots'] = $db->query("SELECT COUNT(id) AS badBots FROM tbl_bad_bots;"); 
$statsresults['del_num_attacks'] = $db->query("SELECT SUM(noattacks) AS deltotalattacks FROM tbl_delaccounts;"); 
$statsresults['num_attacks'] = $db->query("SELECT SUM(num_attacks) AS totalattacks FROM tbl_accounts8;"); 
$statsresults['dup_blocks'] = $db->query("SELECT COUNT(id) AS dupBlocks FROM tbl_duplicates8;"); 

將返回此:

| ['newIPBan0newIPBan'] = String(6) "289033" 
| ['oldIPBan0oldIPBan'] = String(6) "125723" 
| ['log_blocks0logBlocks'] = String(4) "6481" 
| ['badbots0badBots'] = String(5) "15310" 
| ['del_num_attacks0deltotalattacks'] = String(9) "119494860" 
| ['num_attacks0totalattacks'] = String(8) "25286478" 
| ['dup_blocks0dupBlocks'] = String(6) "179916" 

所以現在它被調用數據庫7倍獲得每筆金額或數量。我希望將其改爲1個數據庫調用並將其全部返回。

+4

能否請您提供更多的信息對你正在嘗試做的?例如'JOIN''tbl_duplicates8'到6個其他表,然後返回特定字段的SUM和COUNT?就目前而言,Sql查詢沒有多大意義。 – StuartLC

+0

請提供樣本數據和期望的結果。 SQL的問題在於它不是SQL,很難(不可能)弄清楚你正在做什麼。 –

+0

我更新了這個問題,舉了一個我目前成功做的例子,雖然需要7次數據庫調用才能實現。我希望我能在1次通話中完成這一切,並返回總數。 謝謝 – SecureLive

回答

2

這是你可以將它們結合起來的一種方法:

select (newIPBan + oldIPBan + logBlocks + badBots + deltotalattacks + totalattacks + dupBlocks 
     ) as NumIPs 
from (SELECT COUNT(ip) AS oldIPBan FROM tbl_ipban8) ipb8 cross join 
    (SELECT COUNT(txt_ip) AS newIPBan FROM tbl_ipban) ipb cross join 
    (SELECT COUNT(id) AS logBlocks FROM tbl_log) l cross join 
    (SELECT COUNT(id) AS badBots FROM tbl_bad_bots) bb cross join; 
    (SELECT coalesce(SUM(noattacks), 0) AS deltotalattacks FROM tbl_delaccounts) da cross join 
    (SELECT coalesce(SUM(num_attacks), 0) AS totalattacks FROM tbl_accounts8) ta cross join 
    (SELECT COUNT(id) AS dupBlocks FROM tbl_duplicates8) d; 
+0

我可以看到這是如何工作的,雖然它仍然返回null。我會玩這個幾個,看看我能否得到這個工作。謝謝 – SecureLive

+0

@SecureLive。 。 。它由於sum()而返回'NULL'。那些可能返回NULL,導致'select'中的全部和爲NULL。用'coalesce()'固定。 –

+0

另外,我注意到newIPBan + newIPBan,將第二個更改爲oldIPBan,這兩個地方解決了這個問題......將添加coalesce以及...謝謝!這真是太棒了,讓我給你買一隻熊,你可以把你的貝寶地址寄給我,並且我會發一些錢給你。再次感謝! – SecureLive

0

編輯

我會親自創造的各種度量view,大意如下:

CREATE VIEW vwMetrics AS 
    SELECT 'newIPBan' AS Metric, COUNT(ip) AS Value FROM tbl_ipban8 
    UNION 
    SELECT 'oldIPBan', COUNT(txt_ip) FROM tbl_ipban 
    UNION 
    SELECT 'logBlocks', COUNT(id) FROM tbl_log 
    UNION 
    SELECT 'badBots', COUNT(id) AS badBots FROM tbl_bad_bots 
    UNION 
    SELECT 'deltotalattacks', SUM(noattacks) FROM tbl_delaccounts 
    UNION 
    SELECT 'totalattacks', SUM(num_attacks) FROM tbl_accounts8 
    UNION 
    SELECT 'dupBlocks', COUNT(id) FROM tbl_duplicates8; 

然後你就可以聚集部分:

SELECT SUM(Value) AS TotalOfEverything 
FROM vwMetrics; 

的該觀點的好處在於,您可以深入查看組件以進行詳細/調試,而不是ar在一個神奇的總計上徘徊 - 可能會有一些重用,以便在系統中的其他位置使用該視圖。

Prototype Fiddle here

(+感謝澄清的問題)