2012-07-21 5 views
7

私はクライアント用のオークションサイトを構築していますが、入札テーブルから入札単価を取り除く必要がある問題があります。そのポイントは入札者数または予約数によって決まります価格。MySQLは特定のポイントまで行を削除します

さらに詳しく説明します。私はデータがあるテーブルを持っています:

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が入札を取り消すと、オークションのすべての入札単価はキャンセルされます(クライアント要件)。その場合(bidder2は入札を取り消す)、入札者1の入札はオークションの予備価格である1000ドルにロールバックする必要があります(bidder1、$ 550、$ 1000の2つの入札単価が並んでいるため)。

私が望んでいるHeresはちょっと難しいビットであり、不可能なビットではありません。 bidder2が彼らの入札をキャンセルした場合、私はbidder3の最新の入札までロールバックが、それでもbidder1が勝つとする必要が

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 

:私は3件の入札者を持っていると言います。

ご了承ください。

+0

入札額は入札者1のためにはどうすればよいですか?まだ7.25kまたは6.25k + 1?または? – Kris

+0

3,4、... nユーザーのロジックを一般化する必要があります。現在のところ、第1のケースと第2のケースで共通するものはありません。 – Lobo

答えて

1

第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"); 
} 

これはuのを助けることを願っを削除することを検討してください。

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 

必要に応じてその後、あなたがそれらとプロセスの両方を比較します:

二つ以上の入札者のために
0

  1. グループ入札者および最高入札によっては、各入札者と彼らの最大の入札のためにあなたに1つの行を提供します。
  2. 入札者の入札を削除します。
  3. 入力した日付でテーブルを注文し、入札者、入札者別にグループ化します。
  4. #3の結果から最も低い入札価格の<を入札した行をすべて削除します。これにより、最も低い入札価格に至るすべての入札単価が削除され、最後の入札である各ユーザーに対して1つの入札単価が残されます。

    1. は、入札者の行を終了し削除します

  5. あなたは2件のだけの入札者がある特殊なケースを持っています。
  6. 入札価格=予約価格の行を検索
  7. 行がある場合、入札価格が<予備価格の行をすべて削除します。これにより、リザーブ価格と一致する最後の入札が残されます。
  8. 予備が満たされていないことを意味する行がない場合、入札単価が<(入札)のすべての行を削除します。オークションに現在の最大入札価格である1行が残されます。

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