MySQL根据预算生成随机产品列表?

时间:2014-11-04 20:31:25

标签: mysql

我正在修改一项功能,以便用户能够指定预算,并让他们收到随机挑选的产品列表,这些产品会尽可能地按照指定的预算加入。

现在看来,我试图用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;
    }
}

1 个答案:

答案 0 :(得分:0)

如果您先定义要包含多少个产品,则结果集的性能和“随机性”可以进一步提高。

$min = 10;
$max = 20;
$total = rand($min,$max);

该算法基于以下内容:

  

在总计为S的n个正数的集合中,其中至少一个小于S除以n(S / n)

步骤:

  1. 随机选择价格
  2. 随机选择价格<(BUDGET-X)/(TOTAL-1)的产品。得到它的价格,假设为Y。
  3. 随机选择价格<(BUDGET-X-Y)/(TOTAL-2)的产品。

重复此操作并获得(共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'];

这可以改善:

  • 查询性能,条件更严格
  • 结果集更加随机,因为您可以轻松地选择第一个产品,而不限制其他产品的预算

参考文献:

My answer using the same algorithm for another question