一次查询多个数据库

Bol*_*wyn 31 mysql multiple-databases

我在自己的数据库中有每个WordPress实例.对于更新,我需要查询所有活动插件,这些插件存储在表'wp_options'中并可通过

WHERE option_name='active_plugins'
Run Code Online (Sandbox Code Playgroud)

如何访问所有活动的插件设置(分布在多个数据库中)并将它们输出到一个SQL结果中?我知道database.tablename语法,但是如何使用上述Where语句继续?

单个数据库中的请求如下所示:

SELECT option_value
  FROM `database`.`wp_options`
 WHERE option_name="active_plugins"
Run Code Online (Sandbox Code Playgroud)

Pen*_*m10 46

SELECT option_value
 FROM `database1`.`wp_options`
  WHERE option_name="active_plugins"
UNION
SELECT option_value
 FROM `database2`.`wp_options`
  WHERE option_name="active_plugins"
Run Code Online (Sandbox Code Playgroud)


Gru*_*ber 10

Pentium10的解决方案很好,但它的缺点是你必须扩展每个要包含的模式的查询.以下解决方案使用预准备语句为MySQL服务器上具有该表的所有模式生成结果集wp_options.这对你来说应该更方便.

DROP PROCEDURE IF EXISTS `MultipleSchemaQuery`;

DELIMITER $$

CREATE PROCEDURE `MultipleSchemaQuery`()
BEGIN
    declare scName varchar(250);
    declare q varchar(2000);

    DROP TABLE IF EXISTS ResultSet;
    create temporary table ResultSet (
     option_value varchar(200)
    );

    DROP TABLE IF EXISTS MySchemaNames;
    create temporary table MySchemaNames (
        schemaName varchar(250)
    );

    insert into MySchemaNames
    SELECT distinct
        TABLE_SCHEMA as SchemaName
    FROM 
        `information_schema`.`TABLES`  
    where 
        TABLE_NAME = 'wp_options';

label1:
    LOOP
        set scName = (select schemaName from MySchemaNames limit 1);
        set @q = concat('select option_value from ', scName, '.wp_options where option_name=\'active_plugins\'');
        PREPARE stmt1 FROM @q;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;

        delete from MySchemaNames where schemaName = scName;
        IF ((select count(*) from MySchemaNames) > 0) THEN
            ITERATE label1;
        END IF;
        LEAVE label1;

    END LOOP label1;

    SELECT * FROM ResultSet;

    DROP TABLE IF EXISTS MySchemaNames;
    DROP TABLE IF EXISTS ResultSet;
END
$$

DELIMITER ;

CALL MultipleSchemaQuery();
Run Code Online (Sandbox Code Playgroud)


Tom*_*ill 6

Gruber 的回答很好,但它有一个语法错误 --- 在第 10 行的末尾有一个虚假的逗号。这是代码,修复了语法错误:

DELIMITER $$

CREATE PROCEDURE `MultipleSchemaQuery`()
BEGIN
    declare scName varchar(250);
    declare q varchar(2000);

    DROP TABLE IF EXISTS ResultSet;
    create temporary table ResultSet (
     option_value varchar(200)
    );

    DROP TABLE IF EXISTS MySchemaNames;
    create temporary table MySchemaNames (
        schemaName varchar(250)
    );

    insert into MySchemaNames
    SELECT distinct
        TABLE_SCHEMA as SchemaName
    FROM 
        `information_schema`.`TABLES`  
    where 
        TABLE_NAME = 'wp_options';

label1:
    LOOP
        set scName = (select schemaName from MySchemaNames limit 1);
        set @q = concat('select option_value from ', scName, '.wp_options where option_name=\'active_plugins\'');
        PREPARE stmt1 FROM @q;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;

        delete from MySchemaNames where schemaName = scName;
        IF ((select count(*) from MySchemaNames) > 0) THEN
            ITERATE label1;
        END IF;
        LEAVE label1;

    END LOOP label1;

    SELECT * FROM ResultSet;

    DROP TABLE IF EXISTS MySchemaNames;
    DROP TABLE IF EXISTS ResultSet;
END
$$
Run Code Online (Sandbox Code Playgroud)

  • 欢迎使用堆栈溢出!编辑现有答案比发布新答案更好。你还有编辑权限吗?(我知道他们是该网站的新手,他们可能会在一段时间内陷入困境 22……“正确的做法实际上是这样……而您没有代表。 ") 如果你有足够的代表,你应该编辑答案并删除这个。 (5认同)
  • 非常感谢您对此的答复。是的 - 完全正确;我有一个 catch-22,我无法在该帖子中添加评论,也无法编辑原始答案 --- 因此,除了创建新答案之外,没有任何方法可以提醒人们注意这一点。我试过的所有东西都被删除了——所以,感谢你没有删除这个;一旦我有足够的声誉来做到这一点,我就会回来并做出正确的回答! (3认同)