2012-07-21 20 views
7

Estoy construyendo un sitio de subastas para un cliente y tengo un problema donde necesito eliminar las ofertas de la tabla de ofertas hasta cierto punto, ese punto está determinado por el número de postores o una reserva precio.MySQL borrar fila hasta cierto punto

Déjame explicarte más. Tengo una tabla con datos:

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 

Como puedes ver, hay 2 licitadores que luchan. Ahora cada postor puede cancelar sus ofertas en cualquier momento, sin embargo, digamos que bidder2 cancela sus ofertas, el sistema señala todas las ofertas de la subasta como canceladas (requisito del cliente) y no solo la última. Si ese es el caso (bidder2 cancela sus ofertas) entonces las ofertas de bidder1 deberían volver a $ 1000, que es el precio de reserva de la subasta (como debe saber porque hay 2 ofertas seguidas de bidder1, $ 550 y $ 1000)

Heres lo que estoy esperando es solo lo difícil y no lo imposible. Decir que tengo 3 oferentes:

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 

Si postor2 cancela sus ofertas luego me necesitan para hacer retroceder hasta que la última oferta de bidder3 pero aún con bidder1 ganar.

Cualquier orientación es apreciada.

+0

¿Cuál debe ser el monto de la oferta para el licitador1? aún 7.25k o 6.25k + 1? ¿o? – Kris

+0

debe generalizar la lógica para 3,4, ... n usuarios. A partir de ahora no puedo ver nada común entre el primer y segundo caso. – Lobo

Respuesta

1

primer recuento total no. de licitadores

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

// considerar que queremos eliminar bidder_id = 2 ofertas

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

Esperamos que esto ayude u.

0

Parece que tendrá que manejar dos escenarios: el primero es si el ofertante cancelador es el mejor postor; el segundo es si el postor cancelador no es el mejor postor.

Si el ofertante cancelador es el mejor postor, puede eliminar todas las ofertas después de su primera oferta, incluidas las ofertas de otros usuarios. Si no es el mejor postor, simplemente eliminará todas sus ofertas y dejará en paz a los otros usuarios. Esto se basa en los casos de muestra que proporcionó; avísame si esto no es correcto y me adaptaré.

Estoy asumiendo su estructura db es más o menos así:

users 
    id 
    name 
bids 
    id 
    user_id 
    auction_id 
    price 

Antes de ejecutar el borrado, me agarra la MAX(id) para la subasta actual y para la oferta del licitador cancelación de la subasta actual (asumir la subasta es # 1, # postor cancelación es 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 

a continuación, se podía comparar ambas cosas y el proceso según sea necesario:

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

Durante más de dos oferentes:

  1. Grupo de postor y la puja máxima, le dará una fila por cada licitador y su oferta máxima.
  2. Eliminar las pujas pendientes del pujador.
  3. Ordene la tabla por fecha ingresada, luego haga una oferta, grupo por postores.
  4. Borre todas las filas donde la oferta ingresó < oferta más baja de los resultados del # 3. Esto eliminará todas las ofertas que conducen a la oferta más baja, y ahora deja una oferta para cada usuario, que es su última oferta.

usted tiene un caso especial en el que sólo hay dos oferentes:

  1. Borrado de salir de las filas del postor.
  2. Buscar filas donde precio de oferta = precio de reserva
  3. Si hay filas, elimine todas las filas donde el precio de oferta es < precio de reserva. Esto te deja la última oferta que coincide con el precio de reserva.
  4. Si no hay filas, lo que significa que no se cumplió la reserva, elimine todas las filas donde puja < max (oferta). Esto deja una fila que es la oferta máxima actual en la subasta.

Esto es un poco prolijo - no necesita agrupar por cada vez - pero lo escribí para que pueda confirmar los resultados cuando ejecuta las consultas desde el shell db.

Cuestiones relacionadas