Re: most efficient weighting system? URGENT

From: Date: Fri, 29 Jun 2001 23:11:07 +0000
Subject: Re: most efficient weighting system? URGENT
References: 1  Groups: php.db 
Request: Send a blank email to php-db+get-9980@lists.php.net to get a copy of this message
How many rows are you likely to have, and how dynamic are the weights? I think I'd add a "cumulative sum" column to your table, ie id weight cum_weight 1 10 10 2 5 15 3 3 18 4 20 38 5 2 40 then $query = "SELECT id FROM table WHERE cum_weight >= ".rand(1,40)." ORDER BY cum_weight LIMIT 1"; Note that if you delete or update any row, the cumulative values become incorrect. It would be better to calculate cum_weight dynamically, but I'm not sure how; also, this could be computationally expensive. Another way to do this would be to repeat each row the appropriate number of times, ie id value 1 1 2 1 3 1 ... 10 1 11 2 12 2 ... 15 2 16 3 17 3 18 3 19 4 20 4 ... 37 4 38 4 etc. Then you could use $query = "SELECT value FROM table ORDER BY RAND() LIMIT 1"; ""Noah Spitzer-Williams"" <noahsw@studentcenter.org> wrote in message news:9hilnk$9pp$1@w153.z064000151.sjc-ca.dsl.cnc.net... > if i have several rows in a table and i want some to have certain weights > what is the best way to pick a random row based on its weight? > > ex of table: > id weight > 1 10 > 2 5 > 3 3 > 4 20 > 5 2 > > therefore, since there is a total weight of 40, id 1 should be picked 25% > (10/40) of the time, id 4 50% (20/40), etc... > > what is the best way to do this?

« previous php.db (#9980) next »