7

クライアント向けのオークションサイトを構築していますが、入札者数や予約価格で決まる特定の時点まで、入札テーブルから入札を削除する必要があるという問題があります。

さらに説明させてください。データを含むテーブルがあります。

Bidder1 $7,250.00  Sat 21 Jul 2012 12:25:44
Bidder2 $7,000.00  Sat 21 Jul 2012 12:26:34
Bidder1 $6,250.00  Sat 21 Jul 2012 12:25:44
Bidder2 $6,000.00  Sat 21 Jul 2012 12:26:11
Bidder1 $5,250.00  Sat 21 Jul 2012 12:25:44
Bidder2 $5,000.00  Sat 21 Jul 2012 12:25:34
Bidder2 $1,100.00  Sat 21 Jul 2012 12:23:53
Bidder1 $1,000.00  Sat 21 Jul 2012 12:22:33
Bidder1 $550.00    Sat 21 Jul 2012 12:22:33
Bidder2 $500.00    Sat 21 Jul 2012 12:22:23
Bidder2 $100.00    Sat 21 Jul 2012 12:22:23

ご覧のとおり、2人の入札者が争っています。これで、各入札者はいつでも入札をキャンセルできますが、bidder2が入札をキャンセルすると、システムはオークションのすべての入札に最新の入札だけでなくキャンセル済み(クライアント要件)のフラグを立てます。その場合(入札者2が入札をキャンセルする)、入札者1の入札はオークションの予約価格である$ 1000にロールバックする必要があります(入札者1から2つの入札が連続しているため、$550と$1000であることがわかります)。 )。

ここで私が望んでいるのは、不可能なビットではなく、トリッキーなビットです。3人の入札者がいるとしましょう:

Bidder1 $7,250.00  Sat 21 Jul 2012 12:25:44
Bidder2 $7,000.00  Sat 21 Jul 2012 12:26:34
Bidder3 $6,250.00  Sat 21 Jul 2012 12:25:44
Bidder2 $6,000.00  Sat 21 Jul 2012 12:26:11
Bidder1 $5,250.00  Sat 21 Jul 2012 12:25:44
Bidder2 $5,000.00  Sat 21 Jul 2012 12:25:34
Bidder3 $1,100.00  Sat 21 Jul 2012 12:23:53
Bidder1 $1,000.00  Sat 21 Jul 2012 12:22:33
Bidder1 $550.00    Sat 21 Jul 2012 12:22:33
Bidder2 $500.00    Sat 21 Jul 2012 12:22:23
Bidder2 $100.00    Sat 21 Jul 2012 12:22:23

bidder2が入札をキャンセルした場合、bidder3の最新の入札までロールバックする必要がありますが、それでもbidder1が勝ちます。

任意のガイダンスをいただければ幸いです。

4

3 に答える 3

1

最初のカウント合計数 入札者の

$result = mysql_query("select distinct(bidder_id) from table where bid_id=1");

// bidder_id=2の入札を削除することを検討します

if(mysql_num_rows($result) == 2 ) {
 //select min bid of bidder
 $row = mysql_fetch_row(mysql_query("select * from table where bidder_id=2 order by bid_price asc limit 1"));

 $bidder_min_amount = $row['bid_price'];
 $bidder_min_id = $row['id'];

 //find out other bidder min bid id 
    /*
    Bidder1 $7,250.00  Sat 21 Jul 2012 12:25:44
    Bidder2 $7,000.00  Sat 21 Jul 2012 12:26:34
    Bidder1 $6,250.00  Sat 21 Jul 2012 12:25:44
    Bidder2 $6,000.00  Sat 21 Jul 2012 12:26:11
    Bidder1 $5,250.00  Sat 21 Jul 2012 12:25:44
    Bidder2 $5,000.00  Sat 21 Jul 2012 12:25:34
    Bidder2 $1,100.00  Sat 21 Jul 2012 12:23:53
    Bidder1 $1,000.00  Sat 21 Jul 2012 12:22:33
    Bidder1 $550.00    Sat 21 Jul 2012 12:22:33
    Bidder2 $500.00    Sat 21 Jul 2012 12:22:23
    Bidder2 $100.00    Sat 21 Jul 2012 12:22:23
    //may be first case like this
    Bidder1 $75.00    Sat 21 Jul 2012 12:22:33
    */ 
    //finding out if Bidder1 $75.00 exist
    $row = mysql_query("select * from table where bid_price <= $bidder_min_amount and bidder_id!=2 order by bid_price asc");
    if(mysql_num_rows($row) > 0 ) { 
     mysql_query("delete from table where id > ".$row['id'] );
    } else {
      $row = mysql_query("select * from table where bid_price >= $bidder_min_amount and bidder_id!=2 order by bid_price asc");
      if(mysql_num_rows($row) > 0 ) { 
         mysql_query("delete from table where id > ".$row['id'] );
        }
    } 
} //first condition complete if total bidder is 2
else {
    //if n bidders just remove the bids of bidder
    mysql_query("delete from table where bidder_id=2");
}

これがあなたを助けることを願っています。

于 2012-07-21T04:33:41.477 に答える
0

2つのシナリオを処理する必要があるようです。1つは、キャンセルする入札者が最高入札者である場合です。2つ目は、キャンセルした入札者が最高入札者ではない場合です。

キャンセルした入札者が最高入札者である場合、他のユーザーの入札を含め、最初の入札以降のすべての入札を削除できます。彼らが最高入札者でない場合は、すべての入札を削除し、他のユーザーをそのままにします。これは、提供したサンプルケースに基づいています。これが正しくない場合はお知らせください。調整します。

私はあなたのdb構造が多かれ少なかれこのようであると仮定しています:

users
    id
    name
bids
    id
    user_id
    auction_id
    price

削除を実行する前MAX(id)に、現在のオークションと現在のオークションのキャンセル入札者の入札を取得します(オークションが#1であると仮定すると、キャンセル入札者は#2です)。

SELECT MAX(id) AS max_auction FROM bids WHERE auction_id=1
SELECT MAX(id) AS max_bidder FROM bids WHERE auction_id=1 AND user_id=2

次に、これらの両方を比較し、必要に応じて処理します。

if ($max_auction == $max_bidder) {
    // the cancelling-bidder is the highest-bidder
    // get the ID of their first bid so we can delete every bid after it
    $result = mysql_query("SELECT MIN(id) FROM bids WHERE auction_id=1 AND user_id=2");
    $row = mysql_fetch_array($result);
    mysql_query("DELETE FROM bids WHERE auction_id=1 AND id>=" . $row[0]);
} else {
    // the cancelling-bidder is not the highest-bidder
    // just remove all of their bids
    mysql_query("DELETE FROM bids WHERE auction_id=1 AND user_id=2");
}
于 2012-07-21T04:09:43.200 に答える
0

2人以上の入札者の場合:

  1. 入札者と最高入札額でグループ化すると、入札者とその最高入札額ごとに1行が表示されます。
  2. 既存の入札者の入札を削除します。
  3. 入力した日付でテーブルを注文し、次に入札し、入札者ごとにグループ化します。
  4. #3の結果から、入札が入力されたすべての行<最低入札額を削除します。これにより、最低入札額に至るまでのすべての入札が削除され、最後の入札であるユーザーごとに1つの入札が残されます。

入札者が2人だけの特別な場合があります。

  1. 既存の入札者の行を削除します。
  2. 入札価格=予約価格である行を検索します
  3. 行がある場合は、入札価格が予約価格未満であるすべての行を削除します。これにより、最低価格に一致した最後の入札が残ります。
  4. 行がない場合、つまり予約が満たされていない場合は、bid <max(bid)であるすべての行を削除します。これにより、オークションの現在の最高入札額である1行が残ります。

これは少し冗長です-毎回グループ化する必要はありません-しかし、dbシェルからクエリを実行したときに結果を確認できるように作成しました。

于 2012-07-21T04:32:56.060 に答える