我正在修改一项功能,以便用户能够指定预算,并让他们收到随机挑选的产品列表,这些产品会尽可能地按照指定的预算加入。
现在看来,我试图用PHP做这件事,但是当有大量产品清单时,它往往会变慢。
只有MySQL查询才能实现这一点吗?
编辑:
我的PHP"实施":
$budget = 100;
$spent = 0;
$finished = false;
while(!$finished) {
$getRandomProduct = mysql_query('SELECT `id`, `price` FROM `products` WHERE `price` <= "'.($budget-$spent).'" ORDER BY RAND() LIMIT 1');
if(mysql_num_rows($getRandomProduct)) {
$randomProduct = mysql_fetch_assoc($getRandomProduct);
$productList[] = $randomProduct['id'];
$spent += $randomProduct['price'];
} else {
$finished = true;
}
}
答案 0 :(得分:0)
如果您先定义要包含多少个产品,则结果集的性能和“随机性”可以进一步提高。
$min = 10;
$max = 20;
$total = rand($min,$max);
该算法基于以下内容:
在总计为S的n个正数的集合中,其中至少一个小于S除以n(S / n)
步骤:
重复此操作并获得(共1个)产品。对于最后一种产品,请选择其中价格=剩余价格的一种。 (或价格<=剩余价格和按价格降序排列的订单,希望您能获得足够的价格)。
$budget = 100;
$spent = 0;
$finished = false;
for($i = 0; $i < $total - 1; $i++) {
$getRandomProduct = mysql_query('SELECT `id`, `price` FROM `products` WHERE `price` <= "'.(($budget-$spent)/($total - $i)).'" ORDER BY RAND() LIMIT 1');
if(mysql_num_rows($getRandomProduct)) {
$randomProduct = mysql_fetch_assoc($getRandomProduct);
$productList[] = $randomProduct['id'];
$spent += $randomProduct['price'];
} else {
break;
}
}
$getRandomProduct = mysql_query('SELECT `id`, `price` FROM `products` WHERE `price` <= "'.($budget-$spent).'" ORDER BY `price` DESC LIMIT 1');
$productList[] = $randomProduct['id'];
这可以改善:
参考文献: