0

このコマンドを試して、すべてのサイトのすべての wp_%_options テーブルを選択しようとしています:

SELECT * FROM (SELECT * FROM information_schema.tables WHERE table_name LIKE 'wp_%_options') as t

しかし、1 レベル深くして、これらすべてのフォルダーで option_name = 'template' を取得する必要があります。

これを試しました:

SELECT * FROM (SELECT * FROM information_schema.tables WHERE table_name like 'wp_%_options') as t WHERE option_name='template'

動作していません。

何か案は?

4

3 に答える 3

0

標準の SELECT クエリでは、テーブル名 (または列名) を変数として扱うことはできません。タスクを解決するには、ストアド プロシージャを作成する必要があります。

ストアド プロシージャは次のようにする必要があります。

  1. すべてのテーブル名を取得しますwp_%_options

  2. フェッチされた名前を確認し、PREPARE ステートメントを使用して必要なものを第 2 レベルから選択します。

    DELIMITER | 
    
    DROP PROCEDURE IF EXISTS get_my_tables;
    
    CREATE PROCEDURE get_my_tables (IN option_name VARCHAR(255)) 
    BEGIN 
    
    DECLARE table_name CHAR(255);
    DECLARE done INT DEFAULT FALSE;
    DECLARE first INT DEFAULT TRUE;
    DECLARE cur1 CURSOR FOR SELECT `tables`.`TABLE_NAME` FROM `information_schema`.`tables` `tables` WHERE `tables`.`TABLE_NAME` LIKE 'wp_%_options';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    OPEN cur1;
    
    read_loop: LOOP
        FETCH cur1 INTO table_name;
        IF done THEN
            LEAVE read_loop;
        END IF;
    
        IF (first) THEN
            SET first = FALSE;
            DROP TABLE IF EXISTS `result_table`;
            SET @sql = CONCAT("CREATE TEMPORARY TABLE `result_table` (SELECT * FROM `", table_name ,"` WHERE `option_name` = '", option_name, "')");
        ELSE
            SET @sql = CONCAT("INSERT INTO `result_table` SELECT * FROM `", table_name, "` WHERE `option_name` = '", option_name, "'");
        END IF;
    
        PREPARE stmt FROM @sql; 
        EXECUTE stmt; 
        DEALLOCATE PREPARE stmt;
    END LOOP;
    
    CLOSE cur1;
    
    SELECT * FROM `result_table`;
    
    END; 
    | 
    DELIMITER ;
    
    CALL get_my_tables('template');
    

この例をテストしたところ、期待どおりに動作するようになりました。ニーズに合わせてロジックを調整する必要があります。例: 一時テーブルの操作方法、fesult のフェッチ方法、およびUNION一時テーブルの代わりに使用する方法。

于 2013-02-03T11:29:27.423 に答える
0

これは私が最終的にやったことです:

UPDATE  wp_2_options SET option_value='classic' WHERE option_name='template' OR option_name='stylesheet';

次に、Excelで必要な数を作成しました。それらをすべて変更するのに1分かかりました。

于 2013-02-04T17:12:50.173 に答える
-1

= の代わりに LIKE を使用してみてください。したがって、2 番目のクエリは次のようになります。

SELECT * FROM (SELECT * FROM information_schema.tables WHERE table_name like 'wp_%_options') as t WHERE option_name LIKE 'template'
于 2013-02-03T11:10:35.003 に答える