2012-10-19 52 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? –

相关问题