我们有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子句的数据库列表。
如果将其更改为'information_schema'(即小写字母并用反引号括起)会怎么样? –