SQL如何将相同post_id多行记录按值转列合并为单行
WordPress wp_postmeta 行转列查询方案
你需要的是EAV结构表的行转列效果,使用条件聚合实现即可,该写法兼容所有MySQL版本,也是WordPress开发中查询多postmeta字段的通用高效方案,不存在多表JOIN的性能问题。
适配你当前查询需求的SQL语句
你原本要查询的6个meta_key对应的完整语句如下:
SELECT post_id, MAX(CASE WHEN meta_key = '_regular_price' THEN meta_value END) AS `_regular_price`, MAX(CASE WHEN meta_key = 'multiplier' THEN meta_value END) AS `multiplier`, MAX(CASE WHEN meta_key = 'multiplier_filter' THEN meta_value END) AS `multiplier_filter`, MAX(CASE WHEN meta_key = 'price_filter' THEN meta_value END) AS `price_filter`, MAX(CASE WHEN meta_key = 'attribute_size' THEN meta_value END) AS `attribute_size`, MAX(CASE WHEN meta_key = 'live_update' THEN meta_value END) AS `live_update` FROM wp_postmeta WHERE post_id = 340 AND meta_key IN ( '_regular_price', 'multiplier', 'multiplier_filter', 'price_filter', 'attribute_size', 'live_update' ) GROUP BY post_id;
写法说明
- 核心逻辑是通过
CASE WHEN判断当前行的meta_key,匹配到就返回对应的meta_value,否则返回NULL,再用MAX()聚合函数忽略NULL值,提取出对应key的实际值 - 最后通过
GROUP BY post_id分组,即可将同一个post_id下的多条meta记录合并为单行,每个meta_key对应独立列,和你期望的输出结构完全一致 - WordPress默认单值post meta在同一个post_id下不会重复,因此用
MAX()或者MIN()做聚合都可以,结果不会出错
补充说明
- 如果需要查询多个post_id,直接将WHERE条件中的
post_id = 340改为post_id IN (1,2,3,xxx)即可,每个post_id会返回独立的一行结果 - 如果需要对字段做类型转换(比如价格转为数值类型做计算),可以修改对应字段的取值逻辑,例如
MAX(CASE WHEN meta_key = '_regular_price' THEN meta_value + 0 END) AS regular_price,即可将字符串格式的meta_value转为数值 - 针对你给出的测试样例(price/filter/update三个字段),写法逻辑完全一致:
SELECT post_id, MAX(CASE WHEN meta_key = 'price' THEN meta_value END) AS price, MAX(CASE WHEN meta_key = 'filter' THEN meta_value END) AS filter, MAX(CASE WHEN meta_key = 'update' THEN meta_value END) AS `update` FROM wp_postmeta WHERE post_id = 200 GROUP BY post_id;
运行后即可得到你期望的单行结构结果。
内容的提问来源于stack exchange,提问作者Aleksei .C
相关产品推荐
相关产品推荐

