2012-07-21 9 views
7

Sto costruendo un sito di aste per un cliente e ho un problema in cui devo rimuovere le offerte dalla tabella dell'offerta fino a un certo punto, quel punto è determinato dal numero di offerenti o da una riserva prezzo.MySQL cancella riga fino a un certo punto

Lasciatemi spiegare ulteriormente. Ho una tabella con i dati:

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 

Come potete vedere ci sono 2 offerenti che stanno combattendo. Ora ogni offerente è in grado di cancellare le proprie offerte in qualsiasi momento, tuttavia, l'offerente2 annulla le offerte, il sistema contrassegna tutte le offerte sull'asta come annullate (requisito del cliente) non solo l'ultima. Se questo è il caso (l'offerente2 annulla le loro offerte), le offerte dell'offerente1 dovrebbero tornare a $ 1000, che è il prezzo di riserva per l'asta (come dovresti essere in grado di dire perché ci sono 2 offerte di fila tra offer1, $ 550 e $ 1000).

Ecco quello che spero sia solo un po 'complicato e non un po' impossibile. Dire che ho 3 offerenti:

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 

Se bidder2 cancella le loro offerte poi ho bisogno di rotolare indietro fino a quando l'ultima offerta di bidder3 ma ancora con bidder1 vincente.

Qualsiasi consiglio è apprezzato.

+0

quale deve essere l'importo dell'offerta per l'offerente1? ancora 7.25k o 6.25k + 1? o? – Kris

+0

si dovrebbe generalizzare la logica per 3,4, ... n utenti. A partire da ora non riesco a vedere nulla di comune tra il primo e il secondo caso. – Lobo

risposta

1

primo conteggio totale n. di offerenti

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

// considerano vogliamo rimuovere bidder_id = 2 offerte

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

Spero che questo vi aiuterà u.

0

Sembra che dovrai gestire due scenari: il primo è se l'offerente di annullamento è il miglior offerente; il secondo è se l'offerente che ha annullato non è il miglior offerente.

Se l'offerente di annullamento è il miglior offerente, è possibile eliminare ogni offerta dopo la prima offerta, comprese le offerte degli altri utenti. Se non sono il miglior offerente, elimineresti tutte le loro offerte e lascerai da solo gli altri utenti. Questo si basa sui casi di esempio che hai fornito; fammi sapere se questo non è corretto e mi adeguerò.

sto assumendo la struttura db è più o meno così:

users 
    id 
    name 
bids 
    id 
    user_id 
    auction_id 
    price 

Prima di eseguire la vostra cancellazione, vorrei afferrare il MAX(id) per l'asta in corso e per l'offerta del miglior offerente cancellazione per l'asta corrente (assumere l'asta è # 1, annullando offerente è # 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 

Poi, si dovrebbe confrontare sia di quelli e di processo in base alle esigenze:

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

Per più di due offerenti:

  1. Gruppo per offerente e offerta massima, vi darà una riga per ogni offerente e la loro offerta massima.
  2. Elimina le offerte dell'offerente in uscita.
  3. Ordine tabella per data inserita, quindi offerta, raggruppamento per offerenti.
  4. Elimina tutte le righe in cui l'offerta è stata inserita nell'offerta minima < dai risultati di # 3. Questo rimuoverà tutte le offerte fino all'offerta più bassa, lasciando ora un'offerta per ciascun utente che è la sua ultima offerta.

avete un caso particolare in cui ci sono solo due offerenti:

  1. eliminare uscendo filari di offerente.
  2. Cerca righe dove prezzo di offerta = prezzo di riserva
  3. Se ci sono righe, elimina tutte le righe in cui il prezzo di offerta è il prezzo di riserva <. Questo ti lascia l'ultima offerta che corrisponde al prezzo di riserva.
  4. Se non ci sono righe, il che significa che la riserva non è stata soddisfatta, eliminare tutte le righe in cui l'offerta è < max (offerta). Questo lascia una riga che è l'offerta massima corrente sull'asta.

Questo è un po 'prolisso - non è necessario raggruppare ogni volta - ma l'ho scritto in modo da poter confermare i risultati quando si eseguono le query dalla shell di db.

Problemi correlati