0

我们在同一台服务器上有 100 多个具有相同架构的数据库。我需要在所有数据库上运行相同的 select 语句并返回结果。我查看了几篇关于更改许多数据库的帖子并尝试了这个:

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 做到这一点,有没有办法?

更新:

感谢@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: Unknown database 'information_schema'。当我接受该查询并单独运行它时,我没有收到任何错误,并且它返回与 WHERE 子句匹配的数据库列表。

4

1 回答 1

0

您使用 PHP 发布的解决方案可以在存储过程中完成,这将按照您的要求将逻辑保留在 MySQL 中。

于 2012-10-19T15:01:27.250 回答