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"" <[EMAIL PROTECTED]> wrote in message
9hilnk$9pp$[EMAIL PROTECTED]">news:9hilnk$9pp$[EMAIL PROTECTED]...
> 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?
--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]