mysql相关:如何在所有多站点站点中选择所有option_name ='template'?

时间:2013-02-03 11:03:04

标签: mysql wordpress select phpmyadmin command

我正在尝试此命令来选择所有站点中的所有wp _%_选项表:

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'

不工作。

有什么想法吗?

3 个答案:

答案 0 :(得分: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');
    
  3. 我测试了这个例子现在它按预期工作。你应该根据自己的需要调整一些逻辑。例如:如何使用临时表,获取fesult并使用UNION而不是临时表。

答案 1 :(得分:0)

这就是我最后所做的:

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

然后我在Excel中创建了我需要的数量。我花了1分钟来改变它们。

答案 2 :(得分:-1)

尝试使用LIKE而不是=。 这样第二个查询就是:

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