我正在尝试此命令来选择所有站点中的所有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'
不工作。
有什么想法吗?
答案 0 :(得分:0)
您不能将表名(或列名)视为标准SELECT查询中的变量。要解决此任务,您必须编写存储过程。
存储过程应该:
获取所有表名wp_%_options
;
浏览获取的名称,并使用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
而不是临时表。
答案 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'