2016-11-22 1 views
0

내 경매 관리 소프트웨어에서 한 기능은 입찰자 번호 관리입니다. 이 경우 이전에 사이트에 등록한 고객에게 영구 입찰자 번호 (또는 구매자 번호)를 할당 할 수 있습니다.다음 사용 가능한 "입찰자 번호"선택

내 문제는 사용자에게 주어진 영구 번호가없는 경우 최소한의 사용 가능한 입찰자 번호를 찾고 할당하는 방법을 찾을 수 없다는 것입니다.

예 : 주어진 이벤트 (경매 이벤트)에는 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). 

또한 누군가가 해당 퍼미션 num을 갖고 있으면 숫자를 스킵해야합니다. 지금까지 그래서,

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 
+0

은 어떻게됩니까 (즉 숫자는 미래의 작용에 의해 무효화)? 가장 쉬운 방법은 영원한 번호와 비 영구적 인 번호에 대해 분리 된 집합을 만드는 것입니다. 편지 접두어로. –

답변

0

모두 많은 것들에 달려 있습니다. 간단한 해결책은 숫자 1, 2, 3을 가진 테이블을 갖는 것입니다 ... 최대 1 백만.

그런 다음 당신은 말할 수 :
select min(id) from big_table where id not in (select c_c_PermB FROM as_company_options); 

그래서 (이미 촬영을 제외한) 모든 ID를 선택하고 가장 낮은 하나를 수행합니다.

큰 테이블을 유지하는 것이 가장 좋은 해결책은 아니며, 1 백만 명이 넘는 사용자가있는 경우 테이블을 더 많은 행으로 채워야합니다.

할당 된 입찰자 번호가 사용자 테이블의 auto_incremented int 인 경우 큰 테이블 대신 모든 user_ids를 선택할 수 있습니다.

또 다른 해결책은 1 백만 줄의 목록을 다시 만든 다음 등록 된 모든 큰 숫자를 제거한 다음 올바른 ID 목록을 얻는 것입니다. 등록 된 입찰 번호를 지정할 때마다 목록에서 해당 입찰 번호를 제거하면 갈 수 있습니다. 그러면 경매가 끝나면 모든 임시 ID를 큰 목록으로 되돌릴 수 있습니다.

또 다른 해결책은 1에서 '가장 높은 등록 된 입찰 번호'+1을 사용하여 결과 집합을 만든 다음 큰 목록으로 사용하여 큰 테이블을 생성하는 것입니다. 이것은 하나의 메인 테넌트를 필요로하지 않을 것입니다.

최상의 솔루션은 실제로 얼마나 많은 사용자가 있고 얼마나 빨리 있어야하며 테이블을 설치하는 방법에 달려 있습니다.

이 솔루션은 위의 작동합니다하지만 최고의 하나되지 않을 수도 있습니다 .. 영구 번호가 유효한 번호를 할당 한 후 등록되어있는 경우

관련 문제