选择下一个可用的"投标人编号"

时间:2016-11-22 05:28:48

标签: php mysql math

在我的拍卖管理软件中,一个功能是投标人编号管理。在这种情况下,您可以将永久性投标人编号(或买方编号)分配给您之前在网站上注册的客户。

我的问题是,如果用户没有给定的永久号码,我无法弄清楚如何找到最低可用出价者编号并进行分配。

例如...... 特定事件(拍卖活动)有4个注册投标人。

Bidder #1 => Assigned #21 (has perm num set to #21)
Bidder #2 => Assigned #1 (has no perm num set)
Bidder #3 => Assigned #3 (has perm num set to #3)
Bidder #4 => Assigned #2 (has no perm num set).

此外,如果某人有烫发号码,它必须跳过一个号码。 所以,

Bidder #5 => Assigned #5 (for example) because #4 is taken by someone with perm num set to #4

到目前为止我的代码:

 if(!empty($_GET['add_bidder'])){
        $cID = $_GET['add_bidder'];
        $eID = $_GET['eventID'];
        $eDI = $_GET['eDI'];
        $sum   = 0;
        $match = 0;

        $sendtext = mysql_query("SELECT c_sms_to_bidders FROM as_companies WHERE c_userID='".mysql_real_escape_string($_GET['s'])."'");
        $send     = mysql_fetch_array($sendtext);

        $getInfo  = mysql_query("SELECT * FROM as_users WHERE userID='".$cID."'");
        $gotInfo  = mysql_fetch_array($getInfo);

        $checkPermB   = mysql_query("SELECT c_c_PermB FROM as_company_options WHERE c_c_Company='".$_GET['s']."' AND c_c_User='".$gotInfo['user_token']."' LIMIT 1");
        $checkedPermB = mysql_num_rows($checkPermB);

        if($checkedPermB > 0){
            // User has a perm number.

        } else {
            // User doesn't have a perm number. Let's get all the reserved values..
            $checkPermBNumber   = mysql_query("SELECT c_c_PermB FROM as_company_options WHERE c_c_Company='".$_GET['s']."'");
            $gotPermBNumbers    = mysql_num_rows($checkPermBNumber);

            if($gotPermBNumbers > 0){
                $biddernum = 1;
                if($gotPermBNumbers > 0){
                    while($biddernums = mysql_fetch_assoc($checkPermBNumber)){
                        if($biddernum == $biddernums['c_c_PermB']){
                            $biddernum++;
                            continue;
                        } else {
                            break;
                        }
                    }
                    echo "bidder will be given #".$biddernum;
                }
            }
        }
    } else {
        // invalid approach
    }

请忽略已弃用的功能,为示例目的更容易输入。

所以回到我的问题......我做错了什么? 这是我的流程图:

Add Bidder Function Fired =>
Get Info About Given User =>
Check if User Has Perm # =>
=> yes
- get perm bid num, assign, save & wait to add another
=> no
- get next available bidder num (can't be a num that someone has reserved (perm num) and can't be already taken (for given event; bidder numbers are per event), assign next available bidder num, save & wait to add another

1 个答案:

答案 0 :(得分:0)

这一切都取决于很多事情。一个简单的解决方案是拥有一个数字1,2,3 ......最多可以说100万的表。

然后你可以说:

select min(id) from big_table where id not in (select c_c_PermB FROM as_company_options);

因此,选择所有ID(已经采用的除外)并取最低值。

保持这样的大表当然不是最好的解决方案,如果你有超过100万用户,你需要填充更多行的表。

如果您分配的投标人编号是用户表的auto_incremented int,您只需选择所有user_ids而不是大表。

另一个解决方案是,如果要放慢速度,那就是再次列出100万行,然后删除所有已注册的大数字,然后你就会得到一个有效ID列表。每次分配注册的出价编号时,都会将其从列表中删除,然后您就可以开始使用了。然后,当拍卖结束时,您可以将所有临时ID返回到大清单。

另一个解决方案是通过创建一个结果集来生成大表,其中包含1到最高的注册出价编号' + 1然后使用它作为大清单。这个不需要任何维护......

最佳解决方案实际上取决于您拥有多少用户以及需要多快以及如何设置表。

上述解决方案可行,但可能不是最佳解决方案..