2016-11-22 3 views
0

In meiner Auktionsverwaltungssoftware ist eine Funktion die Bieternummerverwaltung. In diesem Fall können Sie Kunden, die Sie zuvor auf der Website registriert haben, permanente Bieternummern (oder Käufernummern) zuweisen.Auswählen der nächsten verfügbaren "Bieternummer"

Mein Problem ist, ich kann nicht herausfinden, wie die minimale verfügbare Bieternummer gefunden und zugewiesen wird, wenn der Benutzer keine feste Nummer hat.

Zum Beispiel .. Ein bestimmtes Ereignis (Auktionsveranstaltung) hat 4 registrierte Bieter.

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). 

Auch muss es eine Zahl überspringen, wenn jemand diese Perm-Nummer hat. So ,

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

Mein Code so weit:

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 
    } 

Bitte beachten Sie die veralteten Funktionen ignorieren, war es leichter, zum Beispiel Zwecke zu geben.

Also zurück zu meiner Frage .. Was mache ich falsch? Hier ist mein Flussdiagramm:

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

Was passiert, wenn eine permanente Zahl nach Zuweisung gültigen Nummern registriert passieren wird (das heißt die Anzahl von einer künftigen Aktion ungültig gemacht)? Der einfachste Weg besteht darin, disjunkte Sätze für permanente und nicht permanente Nummern zu haben, z. mit einem Buchstabenpräfix. –

Antwort

0

Alles hängt von vielen Dingen. Eine einfache Lösung wäre eine Tabelle mit den Zahlen 1,2,3 ... bis zu 1 Million.

Dann können Sie sagen:

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

So alle IDs auswählen (mit Ausnahme der bereits genommen) und die niedrigste nehmen.

Einen großen Tisch so zu halten ist natürlich nicht die beste Lösung und wenn Sie mehr als 1 Million Benutzer haben, müssen Sie die Tabelle mit mehr Zeilen füllen.

Wenn die Bieternummer, die Sie zugewiesen bekommen haben, ein auto_incremented int für die Benutzertabelle ist, können Sie einfach alle user_ids anstelle der großen Tabelle auswählen.

Eine andere Lösung, wenn dies zu langsam wäre, wäre wieder eine Liste von 1 Million Zeilen zu haben und dann alle registrierten großen Zahlen zu entfernen und dann hätte man eine Liste gültiger IDs. Und jedes Mal, wenn Sie eine registrierte Gebotsnummer zuweisen, entfernen Sie sie aus der Liste und dann können Sie loslegen. Wenn die Auktion vorbei ist, können Sie alle temporären IDs zur großen Liste zurückgeben. Eine andere Lösung wäre, die große Tabelle on-the-fly zu erstellen, indem Sie eine Ergebnismenge mit 1 bis "höchste registrierte Gebotsnummer" + 1 erstellen und diese dann als große Liste verwenden. Dieser benötigt keine Wartung.

Die beste Lösung hängt wirklich davon ab, wie viele Benutzer Sie haben und wie schnell es sein muss und wie die Tabellen eingerichtet sind.

Die Lösung oben funktionieren würde, aber das beste ist vielleicht nicht ..

Verwandte Themen