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

如何从MySQL查询结果循环中获取指定值的序号

问题描述
  • 现有如下MySQL查询语句,执行后会返回若干结果(示例为11条):
$sel_sub = $conn->query("SELECT p.id AS pID , p.pack_id, p.tender_id, p.item_name,s.total_volume AS tv FROM pack_items p LEFT JOIN suppling_details s ON s.pack_item = p.id WHERE p.tender_id = $tender ");
  • 需要定义一个匹配某条查询结果的变量,在查询结果中搜索该变量对应的值,并输出它在循环中的排序序号。当前使用的循环代码如下:
$i = 0;
while ($rec = mysqli_fetch_assoc($sel_sub)) {
    $i++;
    $pdf->Cell(200, 15, $i . $rec['item_name'].$user['item_name'], 1, 1, 'C', 1);
}
实现方案

方法1:先存储结果集与序号映射

先将所有查询结果存入数组并记录序号,后续直接通过变量值查找对应序号,不影响原有PDF输出逻辑:

// 存储结果集及对应序号
$results = [];
$i = 0;
while ($rec = mysqli_fetch_assoc($sel_sub)) {
    $i++;
    $rec['sort_order'] = $i; // 为每条结果添加序号字段
    $results[] = $rec;
    // 保留原有的PDF输出代码
    $pdf->Cell(200, 15, $i . $rec['item_name'].$user['item_name'], 1, 1, 'C', 1);
}

// 定义要搜索的目标变量值(示例为匹配item_name字段)
$target_value = "你要匹配的目标值";
$target_order = null;

// 遍历结果集查找序号
foreach ($results as $item) {
    if ($item['item_name'] === $target_value) {
        $target_order = $item['sort_order'];
        break; // 找到第一个匹配项后停止遍历
    }
}

// 输出结果
if ($target_order !== null) {
    echo "匹配项的排序序号:" . $target_order;
} else {
    echo "未找到匹配项";
}

方法2:用关联数组直接映射(适用于匹配字段唯一的场景)

如果用来匹配的字段(比如item_name或pID)是唯一的,可以直接构建关联数组,提升查找效率:

$results_map = [];
$i = 0;
while ($rec = mysqli_fetch_assoc($sel_sub)) {
    $i++;
    // 用匹配字段作为键,序号作为值
    $results_map[$rec['item_name']] = $i;
    // 保留原有的PDF输出代码
    $pdf->Cell(200, 15, $i . $rec['item_name'].$user['item_name'], 1, 1, 'C', 1);
}

// 查找序号
$target_value = "你要匹配的目标值";
if (isset($results_map[$target_value])) {
    echo "匹配项的排序序号:" . $results_map[$target_value];
} else {
    echo "未找到匹配项";
}
重要提示
  • 若匹配字段存在重复值,方法1会返回第一个匹配项的序号;如果需要收集所有匹配项的序号,可去掉break并将序号存入数组。
  • 原查询语句存在SQL注入风险,建议改用预处理语句:
$stmt = $conn->prepare("SELECT p.id AS pID , p.pack_id, p.tender_id, p.item_name,s.total_volume AS tv FROM pack_items p LEFT JOIN suppling_details s ON s.pack_item = p.id WHERE p.tender_id = ?");
$stmt->bind_param("i", $tender); // 若$tender是字符串类型,将"i"改为"s"
$stmt->execute();
$sel_sub = $stmt->get_result();

内容的提问来源于stack exchange,提问作者Dilara Adams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:25:21