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

PHP实现按company_id分组生成用户位置序列编号的方法

按company_id分组生成序列编号的解决方案

原代码问题分析

你当前的代码逻辑错误在于用唯一的id字段作为分组判断依据,每条记录的id都是不同的,导致每次循环都会重置seq为1,无法实现同一company_id内的序列递增。正确的判断依据应该是company_id。

解决方案一:MySQL查询直接生成序号(推荐)

通过MySQL用户变量在查询阶段直接生成分组内的序列编号,效率更高且逻辑更简洁:

SELECT 
    user_id, 
    company_id,
    @seq := CASE WHEN @current_company = company_id THEN @seq + 1 ELSE 1 END AS position,
    @current_company := company_id
FROM 
    user_company,
    (SELECT @current_company := NULL, @seq := 0) AS init
ORDER BY 
    company_id, id;

对应的PHP调用代码:

$sql = 'SELECT 
            user_id, 
            company_id,
            @seq := CASE WHEN @current_company = company_id THEN @seq + 1 ELSE 1 END AS position,
            @current_company := company_id
        FROM 
            user_company,
            (SELECT @current_company := NULL, @seq := 0) AS init
        ORDER BY 
            company_id, id';
$result = $conn->query($sql);

if($result->num_rows){
    while($obj = $result->fetch_object()){
        echo 'Company: '.$obj->company_id.', User: '.$obj->user_id.', position: '.$obj->position.'<br/>';
    }
}

解决方案二:修正PHP代码逻辑

如果希望在PHP层面处理序列,只需将判断依据改为company_id,并维护当前公司的状态:

$sql = 'SELECT `id`, `user_id`, `company_id` FROM `user_company` ORDER BY `company_id`, id';
$result = $conn->query($sql);

if($result->num_rows){
    $current_company = '';
    $seq = 1;
    while($obj = $result->fetch_object()){
        if($current_company != $obj->company_id){
            $seq = 1;
            $current_company = $obj->company_id;
        }else{
            $seq++;
        }
        
        echo 'Company: '.$obj->company_id.', User: '.$obj->user_id.', position: '.$seq.'<br/>';
    }
}

注:查询时需额外按id排序,确保同一公司内的用户顺序与表中存储顺序一致。

内容的提问来源于stack exchange,提问作者Laci K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:15:45