2012-07-21 9 views
7

Buduję witrynę aukcyjną dla klienta i mam problem, w którym muszę usunąć oferty ze stołu licytacyjnego, aż do pewnego punktu, którego punkt zależy od liczby oferentów lub rezerwy Cena £.Usuń wiersz MySQL do pewnego momentu

Pozwolę sobie wyjaśnić dalej. Mam tabelę z danymi:

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 

Jak widać, licytuje go 2 oferentów. Teraz każdy licytujący może anulować swoje oferty w dowolnym momencie, jednak, powiedzmy, że licytujący 2 anuluje ich oferty, system odrzuci wszystkie oferty aukcji jako anulowane (wymóg klienta), a nie tylko ich najnowszy. W takim przypadku (licytujący 2 anuluje ich oferty), oferty licytującego 1 powinny wrócić do wartości 1000 USD, która jest ceną minimalną za aukcję (jak powinieneś być w stanie powiedzieć, ponieważ są 2 oferty z rzędu od licytującego1, 550 $ i 1000 $).

Oto, co mam nadzieję, to tylko podstępny, a nie niemożliwy. Że mam 3 oferentami:

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 

Jeśli bidder2 anuluje ich oferty to muszę cofnąć aż do najnowszej oferty z bidder3 ale wciąż z bidder1 wygraną.

Wszelkie wskazówki są mile widziane.

+0

jaka powinna być wysokość oferty dla oferenta1? nadal 7.25k lub 6.25k + 1? lub? – Kris

+0

powinieneś uogólnić logikę dla 3,4, ... n użytkowników. W tej chwili nie widzę żadnej rzeczy wspólnej między pierwszym a drugim przypadkiem. – Lobo

Odpowiedz

1

pierwsza liczba całkowita liczba nie. oferentów

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

// uważają chcemy usunąć bidder_id = 2 ofert

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

nadzieję, że to pomoże u.

0

Wygląda na to, że zajmiemy się dwoma scenariuszami - pierwszy polega na tym, że licytant rezygnujący z licytacji ma najwyższą cenę; druga to sytuacja, w której oferent odwołujący nie jest licytantem, który zaoferował najwyższą cenę.

Jeśli oferent, który anulował ofertę, oferuje najwyższą cenę, możesz usunąć każdą ofertę po pierwszej ofercie, w tym stawki innych użytkowników. Jeśli nie jest on licytantem, który oferuje najwyższą cenę, po prostu usuwałbyś wszystkie swoje oferty i pozostawiał innych użytkowników w spokoju. Jest to oparte na dostarczonych przykładowych przypadkach; daj mi znać, jeśli to nie jest poprawne i dostosuję się.

Jestem zakładając swoją strukturę db jest mniej więcej tak:

users 
    id 
    name 
bids 
    id 
    user_id 
    auction_id 
    price 

Przed uruchomieniem Twój kasowania, chciałbym chwycić MAX(id) dla bieżącej aukcji i licytować Anulowanie oferenta w bieżącym aukcji (zakładamy, że aukcja jest nr 1, anulowanie oferent jest # 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 

Wtedy byś porównać oba te i procesu zgodnie z potrzebami:

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

Od ponad dwóch oferentów:

  1. Grupa przez oferenta i maks oferty, daje jeden wiersz dla każdego oferenta i ich maksymalne stawki.
  2. Usuń aktualne oferty licytantów.
  3. Zamów tabelę według wprowadzonej daty, a następnie licytuj, grupuj według oferentów.
  4. Usuń wszystkie wiersze, w których stawka podała < najniższą ofertę z wyników # 3. Spowoduje to usunięcie wszystkich stawek prowadzących do najniższej stawki, teraz pozostawiając jedną stawkę dla każdego użytkownika, która jest ich ostatnią ofertą.

Masz specjalny przypadek, w którym istnieją tylko dwóch oferentów:

  1. Usuń wychodzenia wiersze oferenta.
  2. Wyszukaj wiersze, w których cena ofertowa = cena minimalna
  3. Jeśli istnieją wiersze, usuń wszystkie wiersze, dla których cena ofertowa to < cena minimalna. To pozostawia ci ostatnią ofertę, która pasuje do ceny minimalnej.
  4. Jeśli nie ma żadnych wierszy, co oznacza, że ​​rezerwa nie została zrealizowana, usuń wszystkie wiersze, na które licytujesz < maks. (Stawka). Pozostawia to jeden wiersz, który jest bieżącą ofertą maksymalną na aukcji.

To jest trochę gadatliwe - nie musisz grupować się za każdym razem - ale napisałem to tak, że możesz potwierdzić wyniki, gdy uruchomisz kwerendy z powłoki db.