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 个竞标者在争夺它。现在每个投标人都可以随时取消他们的投标,但是,假设投标人 2 取消了他们的投标,系统会将拍卖中的所有投标标记为已取消(客户要求),而不仅仅是他们最新的投标。如果是这种情况(投标人 2 取消了他们的投标),那么投标人 1 的投标应该回滚到 1000 美元,这是拍卖的底价(因为您应该能够知道,因为投标人 1 连续两次投标,分别是 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

如果投标人 2 取消他们的投标,那么我需要回滚到投标人 3 的最新投标,但投标人 1 仍然获胜。

任何指导表示赞赏。

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

对于两个以上的投标人:

  1. 按出价者和最高出价分组,将为您提供每个出价者及其最高出价的一行。
  2. 删除现有投标人的投标。
  3. 按日期输入订单表,然后按投标人分组。
  4. 从#3 的结果中删除所有出价 < 最低出价的行。这将删除导致最低出价的所有出价,现在为每个用户留下一个出价,这是他们的最后一次出价。

您有一个特殊情况,只有两个投标人:

  1. 删除现有投标人的行。
  2. 搜索出价 = 保留价的行
  3. 如果有行,则删除所有出价<保留价的行。这将为您留下与底价相匹配的最后一个出价。
  4. 如果没有行,这意味着未满足保留,请删除bid < max(bid) 的所有行。剩下的一行是当前拍卖的最高出价。

这有点冗长——你不需要每次都分组——但我写它是为了在你从 db shell 运行查询时可以确认结果。

于 2012-07-21T04:32:56.060 回答
0

听起来您需要处理两种情况-第一种是取消出价者是最高出价者;第二个是如果取消投标人不是最高出价者。

如果取消出价者是最高出价者,您可以删除他们第一次出价后的每个出价,包括其他用户的出价。如果他们不是最高出价者,您只需删除他们的所有出价,而让其他用户不理会。这是基于您提供的示例案例;让我知道这是否不正确,我会调整。

我假设您的数据库结构或多或少是这样的:

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 回答