2010-09-27 20 views
1

我在MySQL 5.1.41以下查詢:是否可以對mysql數據庫中的每個數據庫執行查詢,並僅使用mysql命令環境對結果進行求和或求和?

 
select distinct table_schema from information_schema.tables where table_schema like '%dog%'; 

我想採取這一命令的輸出:

 
+-------------------+ 
| table_schema  | 
+-------------------+ 
| dog_a    | 
| dog_b    | 
+-------------------+ 

,然後使用該數據庫的名稱作爲輸入,如查詢以下:

 
select count(*) from (select * from dog_a.log where insane = 1 UNION ALL select * from dog_b.log where insane = 1) as total_count; 

,使得該算法本質上是:

對於數據庫中的每個數據庫,計算瘋狂的狗的數量並將所有數據庫中的總數相加。然而,我不知道如何包裝這兩個查詢來從第一個查詢中獲取數據庫名作爲mysql內第二個查詢的迭代輸入。

我需要能夠完全在數據庫中完成此操作。

任何想法?

謝謝!

回答

2

這樣的事情可能會發生。我還沒有一堆'與日誌狗'來測試這種情況,但我嘗試了一個稍微修改過的版本,並且基本想法似乎工作。

在一個變量中建立查詢字符串,然後使用prepared statement來執行它。

SELECT @query:=CONCAT(
     'select count(*) from (' 
    , GROUP_CONCAT(CONCAT(y.prefix, x.table_schema, y.postfix) SEPARATOR ' UNION ALL ') 
    , ') as total_count') 
FROM (
    SELECT DISTINCT table_schema 
    FROM information_schema.tables 
    WHERE table_schema LIKE '%dog%' 
    ) AS x 
JOIN (
    SELECT 
      'select * from '  AS prefix 
     , '.log where insane = 1' AS postfix 
    ) AS y 
; 

-- SELECT @query AS Query; 

PREPARE STMT FROM @query; 
EXECUTE STMT; 
DEALLOCATE PREPARE STMT; 
+0

這解決了我在MySQL 5.1上的問題。但是,我注意到它破壞了MySQL 5.0。問題似乎是生成的中間聯合查詢在大約10%的表中截斷爲查詢。截斷很清楚,因爲select語句被削減了一半。我會追求這個問題,但是如果你知道可能會造成什麼問題,我會全神貫注。它看起來像一個bug。這是在centos上運行mysql 5.0.77。謝謝。 – 2010-09-28 18:06:20

+1

我想到了mysql 5.0上的問題。 GROUP_CONCAT_MAX_LEN默認爲1024,這取決於您定義了多少個數據庫。在這種情況下,我們有〜100,所以生成的SQL在GROUP_CONCAT中被截斷。解決方案是將GROUP_CONCAT_MAX_LEN設置爲會話中足夠大的內容,例如:set session group_concat_max_len = 102400; – 2010-09-29 22:49:54

+0

@David - 你在5.1上設置了更高的值,然後呢? – 2010-09-29 22:51:14

相關問題