MySQL自连接查询实现:获取与指定军官共事的其他军官关联服务记录
解决军官共事统计的自连接查询方案(WordPress wpdb实现)
没问题,我帮你把嵌套循环的逻辑转换成高效的自连接查询,完全适配WordPress的wpdb用法,性能会比循环好很多!
首先先明确核心逻辑:通过服务记录表的自连接,找到和目标军官共享同一条报告行的其他军官,再通过时间筛选限制在15年内,最后去重统计人数。
假设你的表结构(如果字段名有差异,自行调整)
wp_officers:军官表,主键id,其他字段比如full_namewp_service_records:服务记录表,包含officer_id(关联军官主键)、record_line_f_key(关联报告行主键)、service_date(服务日期,用于筛选15年范围)
完整的WordPress实现代码
global $wpdb; // 传入的目标军官主键(示例从GET参数获取,注意转义处理) $target_officer_id = absint($_GET['officer_id']); // 计算15年前的日期,适配MySQL的日期格式 $fifteen_years_ago = date('Y-m-d', strtotime('-15 years')); // 定义带WordPress前缀的表名 $service_records = $wpdb->prefix . 'service_records'; $officers = $wpdb->prefix . 'officers'; // --- 1. 查询所有直接共事的军官详情(去重) --- $co_officers_query = $wpdb->prepare( " SELECT DISTINCT sr2.officer_id, o.full_name FROM $service_records sr1 JOIN $service_records sr2 ON sr1.record_line_f_key = sr2.record_line_f_key JOIN $officers o ON sr2.officer_id = o.id WHERE sr1.officer_id = %d AND sr2.officer_id != %d AND sr1.service_date >= %s ORDER BY o.full_name ", $target_officer_id, $target_officer_id, $fifteen_years_ago ); $co_officers_list = $wpdb->get_results($co_officers_query); // --- 2. 直接统计共事军官的人数 --- $co_officer_count_query = $wpdb->prepare( " SELECT COUNT(DISTINCT sr2.officer_id) AS total_count FROM $service_records sr1 JOIN $service_records sr2 ON sr1.record_line_f_key = sr2.record_line_f_key WHERE sr1.officer_id = %d AND sr2.officer_id != %d AND sr1.service_date >= %s ", $target_officer_id, $target_officer_id, $fifteen_years_ago ); $total_co_officers = $wpdb->get_var($co_officer_count_query); // 示例输出 echo "目标军官15年内共与 {$total_co_officers} 位军官直接共事";
代码逻辑拆解
自连接的作用:
sr1代表目标军官的所有服务记录,通过sr1.officer_id = $target_officer_id筛选,同时用service_date限制15年范围sr2通过record_line_f_key和sr1关联,拿到所有和目标军官共享同一条报告行的服务记录- 用
sr2.officer_id != $target_officer_id排除目标军官自己
去重的必要性:
- 同一个军官可能和目标军官多次共事(出现在多条报告行),用
DISTINCT确保每个军官只统计一次
- 同一个军官可能和目标军官多次共事(出现在多条报告行),用
性能优化建议:
- 给
wp_service_records的record_line_f_key和officer_id字段加上索引,能大幅提升自连接查询的速度 - 如果只需要统计人数,不需要军官详情,可以去掉和
wp_officers表的连接,进一步简化查询
- 给
内容的提问来源于stack exchange,提问作者Sam McLean
相关产品推荐
相关产品推荐

