38

それぞれが独自のデータベースにある WordPress インスタンスがあります。更新のために、テーブル「wp_options」に保存され、経由でアクセス可能なすべてのアクティブなプラグインを照会する必要があります

WHERE option_name='active_plugins'

すべてのアクティブなプラグイン設定 (複数のデータベースに分散) にアクセスし、それらを 1 つの SQL 結果として出力するにはどうすればよいですか? database.tablename構文は知っていますが、そこから上記のWhereステートメントをどのように使用すればよいでしょうか?

単一のデータベースでのリクエストは次のようになります。

SELECT option_value
  FROM `database`.`wp_options`
 WHERE option_name="active_plugins"
4

4 に答える 4

53
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"
于 2010-01-25T13:48:32.440 に答える
12

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();
于 2012-12-13T17:21:23.110 に答える
7

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
$$
于 2014-08-21T20:11:07.427 に答える