You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL自连接查询实现:获取与指定军官共事的其他军官关联服务记录

解决军官共事统计的自连接查询方案(WordPress wpdb实现)

没问题,我帮你把嵌套循环的逻辑转换成高效的自连接查询,完全适配WordPress的wpdb用法,性能会比循环好很多!

首先先明确核心逻辑:通过服务记录表的自连接,找到和目标军官共享同一条报告行的其他军官,再通过时间筛选限制在15年内,最后去重统计人数。

假设你的表结构(如果字段名有差异,自行调整)

  • wp_officers:军官表,主键id,其他字段比如full_name
  • wp_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} 位军官直接共事";

代码逻辑拆解

  1. 自连接的作用:

    • sr1代表目标军官的所有服务记录,通过sr1.officer_id = $target_officer_id筛选,同时用service_date限制15年范围
    • sr2通过record_line_f_key和sr1关联,拿到所有和目标军官共享同一条报告行的服务记录
    • 用sr2.officer_id != $target_officer_id排除目标军官自己
  2. 去重的必要性:

    • 同一个军官可能和目标军官多次共事(出现在多条报告行),用DISTINCT确保每个军官只统计一次
  3. 性能优化建议:

    • 给wp_service_records的record_line_f_key和officer_id字段加上索引,能大幅提升自连接查询的速度
    • 如果只需要统计人数,不需要军官详情,可以去掉和wp_officers表的连接,进一步简化查询

内容的提问来源于stack exchange,提问作者Sam McLean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 07:38:16