SELECT查询时如何配对表字段实现used与对应label字段同步排序

方案1:SQL查询直接实现排序输出
你可以通过UNION ALL将原本的宽表行转为配对的长表数据,直接在SQL层面完成排序,无需后续复杂判断。假设你的表名为wp_archive_transcript,查询单条记录的ID为$transcript_id,示例代码如下:
global $wpdb; $transcript_id = 123; // 替换为你要查询的实际记录ID $pairs = $wpdb->get_results( $wpdb->prepare( "SELECT 'guns' as field_key, guns_used as position, guns_label as label FROM {$wpdb->prefix}archive_transcript WHERE id = %d AND guns_used != -1 UNION ALL SELECT 'men' as field_key, men_used as position, men_label as label FROM {$wpdb->prefix}archive_transcript WHERE id = %d AND men_used != -1 UNION ALL SELECT 'ship_name' as field_key, ship_name_position as position, shipname_label as label FROM {$wpdb->prefix}archive_transcript WHERE id = %d AND ship_name_position != -1 ORDER BY position ASC", $transcript_id, $transcript_id, $transcript_id ) );
查询得到的$pairs数组会直接按position从小到大排序,每个元素都包含对应的字段标识、排序值和标签,直接遍历输出即可。
方案2:PHP层面处理(扩展性更强,适合字段频繁新增的场景)
如果后续还会新增更多配对字段,不用反复修改SQL,直接查询全量单条数据后用PHP自动配对排序,代码更易维护:
global $wpdb; $transcript_id = 123; $record = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}archive_transcript WHERE id = %d", $transcript_id ), ARRAY_A ); $sorted_fields = []; // 定义所有需要配对的字段前缀,后续新增字段只需要补充这个数组即可 $field_prefixes = ['guns', 'men', 'ship_name']; foreach ( $field_prefixes as $prefix ) { $used_key = $prefix . '_used'; $label_key = $prefix . '_label'; // 兼容ship_name的特殊命名规则 if ( $prefix == 'ship_name' ) { $used_key = 'ship_name_position'; $label_key = 'shipname_label'; } if ( isset($record[$used_key]) && $record[$used_key] != -1 ) { $sorted_fields[ $record[$used_key] ] = [ 'label' => $record[$label_key], 'field_key' => $prefix ]; } } // 按used字段的数值升序排序 ksort($sorted_fields);
处理后的$sorted_fields就是按顺序排列的配对字段数组,直接遍历使用即可,不需要写大量if判断。
内容的提问来源于stack exchange,提问作者Sam McLean
相关产品推荐
相关产品推荐

