MySQL WordPress多表查询:关联结果与wp_%%_postmeta对应表
解决WordPress多
wp_%%_postmeta表的重定向数据查询问题 没问题,这事儿我熟!要在MySQL里查询WordPress那些分散的wp_%%_postmeta表,还得把结果和对应表名关联起来,咱们可以借助information_schema来实现动态多表查询,具体方案如下:
核心思路
因为wp_%%_postmeta的表名是动态的(%%是不连续的数字/标识),没法直接写固定的多表查询。所以我们先通过information_schema.TABLES找出所有符合格式的表,然后为每个表生成带表名标识的查询语句,最后把这些语句合并执行,就能得到带表名的完整结果。
步骤1:生成单表查询语句
先运行下面的SQL,替换your_wordpress_db_name为你的WordPress数据库名,它会为每个符合条件的wp_%%_postmeta表生成一条查询语句:
SELECT CONCAT( 'SELECT `meta_key`, `meta_value`, ''', TABLE_NAME, ''' AS `table_name` FROM `', TABLE_NAME, '` WHERE `meta_key` LIKE ''%redirect%'';', CHAR(10) ) AS individual_query FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_wordpress_db_name' AND TABLE_NAME LIKE 'wp\_%\_postmeta' ESCAPE '\';
说明:
TABLE_NAME LIKE 'wp\_%\_postmeta':这里的\_是转义下划线(因为下划线在LIKE里是通配符),确保只匹配wp_xxx_postmeta格式的表。WHERE meta_key LIKE '%redirect%':筛选重定向相关的元数据,如果知道你要找的插件的特定meta_key(比如某个插件用_redirect_rule或_custom_redirect_url),可以把这个条件改成更精确的meta_key = 'your_plugin_specific_key',减少无关结果。
步骤2:合并查询语句并执行
把步骤1生成的所有individual_query结果,用UNION ALL连接起来(注意最后一条语句后面不要加UNION ALL),比如最终的查询会是这样:
SELECT `meta_key`, `meta_value`, 'wp_1_postmeta' AS `table_name` FROM `wp_1_postmeta` WHERE `meta_key` LIKE '%redirect%'; UNION ALL SELECT `meta_key`, `meta_value`, 'wp_5_postmeta' AS `table_name` FROM `wp_5_postmeta` WHERE `meta_key` LIKE '%redirect%'; UNION ALL SELECT `meta_key`, `meta_value`, 'wp_12_postmeta' AS `table_name` FROM `wp_12_postmeta` WHERE `meta_key` LIKE '%redirect%';
执行这个合并后的SQL,就能得到所有包含重定向数据的记录,并且每条记录都会显示它来自哪个wp_%%_postmeta表。
进阶:用存储过程自动执行(可选)
如果你不想手动拼接语句,可以写一个简单的存储过程自动完成:
DELIMITER // CREATE PROCEDURE GetRedirectMetaWithTableName() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE tableName VARCHAR(255); DECLARE sqlStmt TEXT DEFAULT ''; DECLARE cur CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'your_wordpress_db_name' AND TABLE_NAME LIKE 'wp\_%\_postmeta' ESCAPE '\'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cur; read_loop: LOOP FETCH cur INTO tableName; IF done THEN LEAVE read_loop; END IF; SET sqlStmt = CONCAT(sqlStmt, 'SELECT `meta_key`, `meta_value`, ''', tableName, ''' AS `table_name` FROM `', tableName, '` WHERE `meta_key` LIKE ''%redirect%'' UNION ALL '); END LOOP; CLOSE cur; -- 去掉最后一个UNION ALL SET sqlStmt = LEFT(sqlStmt, LENGTH(sqlStmt) - LENGTH(' UNION ALL ')); PREPARE stmt FROM sqlStmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; END // DELIMITER ;
然后调用存储过程:
CALL GetRedirectMetaWithTableName();
这样就能自动完成所有表的查询并返回带表名的结果了。
内容的提问来源于stack exchange,提问作者Bob F.
相关产品推荐
相关产品推荐

