0

我正在尝试使用此命令选择所有站点中的所有 wp_%_options 表:

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

但我需要更深入一层并在所有这些文件夹中获取 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 语句从第二级选择您需要的名称。

    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

Try using LIKE instead of =. So that the second query will be:

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 回答