2016-02-05 12 views
5

Bu, basit ve yapılabilir olması gerektiği gibi görünüyor, ancak akıllı değilim. Tek bir sorgu ile aynı sunucudaki birden çok veritabanında ana bilgisayarların sayısını özetlemeye çalışıyorum. Ana bilgisayar sayımını özetleyen veritabanları, bir sorgudan türetilmiştir. SQL sorgusu, aynı ana bilgisayardaki birden çok veritabanında toplamları saymak için

veritabanlarının bir listesini almak:

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

her veritabanından konak sayısı toplamını alın: Veritabanı adları doğru ve her veritabanı denilen bir tablo tutan varsayarsak

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

cevap

2

İstediğiniz sonucu almak için hazırlanmış deyimi kullanmak zorunda Çıkış - SELECT @sql:

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

@sql değişken, istenen sonucu elde etmek için yürütülmesi gereken dinamik sql deyimini tutuyor.

Demo here

+0

Harika, teşekkürler Giorgos! Ben bir değişiklik yapmak ve .hosts etrafında "' "kaldırmak zorunda kaldı Bu hata aldı: HATA 1146 (42S02): Tablo 'test.companyA.hosts' mevcut değil –

+0

@bighorchata Bu bir hataydı daha sonra tamir ettim. Unutmayın, bu ifade ''' karakterleri olmadan da gerçekleştirilebilir. –

+0

Tekrar teşekkürler, çok takdir –

0

Hosts, hala sorgudaki şema adını eklememiz gerekiyor. Bu yüzden, sahip olduğunuz şema adıyla <schema>'u değiştirin ve aşağıdaki sorguyu çalıştırın ve toplamı almalısınız.

;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 

sonra aşağıdaki kullanabileceği ortak tablo ifade kullanın cant:

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 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

Maalesef MySQL WITH yan tümcesini desteklemiyor. Bu mysql (zaten sahip olduğum etiketin ötesinde) olduğunu açıkça belirtmeliydim –

+0

MySQL WITH yan tümcesini desteklemiyor (SQL Server'daki CTE'de CTE; Oracle'da Alt Sorgu Faktoringi) –

+0

@bighorchata benim ikinci öneri hakkında –

İlgili konular