2012-10-19 41 views
0

我們有100多個數據庫在同一臺服務器上具有相同的模式。我需要在所有數據庫上運行相同的select語句並返回結果。我已經看過直通幾個職位對改變許多DBS,並嘗試這樣的:使用MySQL在多個數據庫上運行相同的查詢

SELECT CONCAT 
    ('SELECT * FROM ', a.table_schema, '.tableIwant 
    GROUP BY CONCAT(emp_id, "-", other_id) 
    HAVING count(CONCAT(emp_id, "-", other_id)) >1') 
FROM information_schema.tables a 
WHERE a.table_schema LIKE 'table_prefix_%' 
GROUP BY a.table_schema; 

但是,所有這些返回的查詢列表。 我知道我可以用PHP做到這一點 - 用一個查詢構建所有dbs的列表,然後在結果集上構建一個WHILE循環等等。但是我想從MySQL做到這一點,有沒有辦法?

UPDATE:

感謝@KayakJim我試圖創建一個存儲過程來解決這個問題:

DELIMITER // 
CREATE PROCEDURE checkDuplicates() 
BEGIN 

DECLARE bDone INT; 
DECLARE dbname VARCHAR(20); 
DECLARE count1, count2 INT; 
DECLARE curs CURSOR FOR SELECT table_schema FROM INFORMATION_SCHEMA.TABLES WHERE table_schema like 'table_%' GROUP BY table_schema; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1; 


CREATE TEMPORARY TABLE IF NOT EXISTS db1.tblResults (
name VARCHAR(20), 
countDupes INT, 
countDupesAll INT 
) ENGINE = MEMORY 
; 

OPEN curs; 

SET bDone = 0; 

REPEAT 
FETCH curs INTO dbname; 

SELECT SQL_CALC_FOUND_ROWS * FROM dbname.table 
GROUP BY CONCAT(emp_id, "-", other_id) 
HAVING count(CONCAT(emp_id, "-", other_id)) >1; 

SET count1 = FOUND_ROWS(); 

SELECT SQL_CALC_FOUND_ROWS * FROM dbname.table 
GROUP BY CONCAT(emp_id, "-", other_id, "-", param) 
HAVING count(CONCAT(emp_id, "-", other_id, "-", param)) >1; 

SET count2 = FOUND_ROWS(); 

UNTIL bDone END REPEAT; 

    CLOSE curs; 
    SELECT * FROM db1.tblResults; 
END; 
// 

CALL checkDuplicates(); 

現在的問題是,當我執行,它會返回錯誤1049:未知數據庫'INFORMATION_SCHEMA'。當我使用該查詢並單獨運行時,我不會收到任何錯誤,並返回匹配WHERE子句的數據庫列表。

+0

如果將其更改爲'information_schema'(即小寫字母並用反引號括起)會怎麼樣? –

回答

0

您使用PHP發佈的解決方案可以在存儲過程中完成,該過程可以保持MySQL內部的邏輯,如您所願。

+0

謝謝,讓我們假設爲了好玩,我需要更多關於Stored Procedures的幫助,我將定義SP,使用第一個查詢作爲變量,然後第二個查詢將該變量用於db_name。然後打電話給SP? –

相關問題