WordPress中从同一列获取不同条件值并在循环中输出的SQL实现问题
解决WordPress中同一订单获取多个meta字段的问题
我来帮你搞定这个问题!你当前的SQL语句存在核心逻辑错误:同一行的meta_key不可能同时等于两个不同的值,这就是你无法得到预期结果的根本原因。下面给你两种可行的解决方案,适配不同的场景:
方案一:两次关联wp_postmeta表(推荐,结构清晰)
这种方法通过两次JOIN操作,分别获取billing_field_739和billing_field_267的值,把它们放到同一行结果中:
global $wpdb; // 使用$wpdb->prefix适配不同的表前缀,避免硬编码 $table_prefix = $wpdb->prefix; $result = $wpdb->get_results(" SELECT pm1.meta_value AS billing_739, pm2.meta_value AS billing_267, os.order_id FROM {$table_prefix}wc_order_stats os INNER JOIN {$table_prefix}postmeta pm1 ON os.order_id = pm1.post_id AND pm1.meta_key = 'billing_field_739' INNER JOIN {$table_prefix}postmeta pm2 ON os.order_id = pm2.post_id AND pm2.meta_key = 'billing_field_267' WHERE os.date_created >= CAST('2022-01-01' AS DATE) AND os.date_created <= CAST('2022-05-01' AS DATE) "); foreach($result as $row ) { ?> <tr> <td><?php echo esc_html($row->billing_739);?></td> <!-- billing_field_739的值 --> <td><?php echo esc_html($row->billing_267);?></td> <!-- billing_field_267的值 --> </tr> <?php } ?>
说明:
- 我们以
wp_wc_order_stats为主表,分别关联两次wp_postmeta,每次关联对应一个目标meta_key - 给两个
meta_value起了别名billing_739和billing_267,方便在循环中直接调用 - 加入
esc_html()函数防止XSS攻击,这是WordPress开发的最佳实践
方案二:使用条件聚合(适合只需要这两个字段的场景)
如果你的需求只是获取这两个字段的值,也可以用CASE WHEN进行条件聚合,把同订单的两个字段值合并到一行:
global $wpdb; $table_prefix = $wpdb->prefix; $result = $wpdb->get_results(" SELECT os.order_id, MAX(CASE WHEN pm.meta_key = 'billing_field_739' THEN pm.meta_value END) AS billing_739, MAX(CASE WHEN pm.meta_key = 'billing_field_267' THEN pm.meta_value END) AS billing_267 FROM {$table_prefix}wc_order_stats os INNER JOIN {$table_prefix}postmeta pm ON os.order_id = pm.post_id AND pm.meta_key IN ('billing_field_739', 'billing_field_267') WHERE os.date_created >= CAST('2022-01-01' AS DATE) AND os.date_created <= CAST('2022-05-01' AS DATE) GROUP BY os.order_id "); foreach($result as $row ) { ?> <tr> <td><?php echo esc_html($row->billing_739);?></td> <td><?php echo esc_html($row->billing_267);?></td> </tr> <?php } ?>
说明:
- 用
IN筛选出需要的两个meta_key,然后通过CASE WHEN分别提取对应的值,再用MAX()聚合(因为同订单同meta_key只会有一条记录,MAX不影响结果) - 按
order_id分组,确保每个订单只返回一行结果
内容的提问来源于stack exchange,提问作者Demonix
相关产品推荐
相关产品推荐

