2016-02-05 28 views
5

這似乎應該是簡單和可行的,但我不聰明。我試圖用一個查詢來概括同一臺服務器上多個數據庫的主機數量。總結主機數量的數據庫本身是從查詢中派生出來的。SQL查詢總結同一主機上的多個數據庫的計數

得到的數據庫列表:

mysql> select name from db1.companies where status = 'active'; 
+---------------------+ 
| name    | 
+---------------------+ 
| companyA   | 
| companyB   | 
| companyC   | 
... 

獲取主機數量從每個數據庫總和:

SUM(
select count(id) from companyA.hosts 
select count(id) from companyB.hosts 
select count(id) from companyC.hosts 
... 
) 

回答

2

你必須使用一個事先準備好的聲明,以獲得在期望的結果:

SELECT 
    GROUP_CONCAT(
    CONCAT(
     '(SELECT count(id) FROM `', 
     name, 
     '`.`hosts`)') SEPARATOR ' + ') 
FROM 
    db1.companies 
WHERE 
    status = 'active' 
INTO @sql; 

SET @sql := CONCAT('SELECT ', @sql); 

SELECT @sql; 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 

輸出SELECT @sql

@sql 
------------------------------------------------------------------------- 
SELECT (SELECT count(id) FROM `companyA`.`hosts`) + 
     (SELECT count(id) FROM `companyB`.`hosts`) + 
     (SELECT count(id) FROM `companyC`.`hosts`) 

因此,@sql變量保存需要執行的動態sql語句以獲得所需的結果。

Demo here

+0

偉大的,謝謝Giorgos!我必須做一個更改,並從。主機刪除「'」其他我收到此錯誤: 錯誤1146(42S02):表'test.companyA.hosts'不存在 –

+0

@bighorchata這是一個錯誤我後來修復了。沒關係,該聲明也可以在沒有'''字符的情況下執行。 –

+0

再次感謝,非常感謝 –

0

假設數據庫名稱是正確的,每個數據庫擁有一個稱爲表主機,我們仍然需要在查詢中包含模式名稱。因此,只需將<schema>替換爲您擁有的模式名稱,然後運行以下查詢,即可獲得總和。

;WITH CTE AS (

select count(id) AS [HostSum] from companyA.<schema>.hosts 
UNION ALL 
select count(id) AS [HostSum] from companyB.<schema>.hosts 
UNION ALL 
select count(id) AS [HostSum] from companyC.<schema>.hosts 

) 

SELECT SUM([HostSum]) AS [HostSum] FROM CTE 

如果你不能使用公用表表達式,那麼你可以使用以下命令:

SELECT SUM([HostSum]) AS [HostSum] FROM (

    select count(id) AS [HostSum] from companyA.<schema>.hosts 
    UNION ALL 
    select count(id) AS [HostSum] from companyB.<schema>.hosts 
    UNION ALL 
    select count(id) AS [HostSum] from companyC.<schema>.hosts 

    ) AS A 
+0

不幸的是,MySQL不支持WITH子句。我應該明確表示這是mysql(超出我已有的標記) –

+0

MySQL不支持WITH子句(SQL Server中的CTE說法; Oracle中的子查詢保理) –

+0

@bighorchata我的第二個建議怎麼樣 –