【问题标题】:MySQL generate random product list based on budget?MySQL根据预算生成随机产品列表?
【发布时间】:2014-11-04 20:31:25
【问题描述】:

我正在修改一个功能,让用户能够指定预算,并让他们收到一份随机挑选的产品列表,这些产品的总和尽可能符合他们的指定预算。

就目前而言,我正在尝试使用 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;
    }
}

【问题讨论】:

  • 您所说的“尽可能好”是什么意思?这听起来像是一个 NP 完全问题,在 PHP 或 MySQL 中都很难实现。你能举一些例子吗?
  • 我的意思是尽可能接近预算,我将添加我现在拥有的东西
  • 。 .这是装箱问题的变体,实际上是 NP-hard。如果不评估所有可能性,就没有已知的快速方法来获得“最佳”解决方案。如果您找到更好的方法,您将拥有一个以您命名的算法。
  • 正如其他人所指出的,您所问的是一项非常难以实现的任务,在您开始考虑 PHP 与 MySQL 之前,您需要考虑要使用什么算法来解决问题。例如,商品价格 99 和商品价格 1 的组合是否优于 100 件价格为 1 的商品?似乎与您对“最佳”和“随机”的渴望不一致。我不认为你可以两者兼得。
  • 谢谢你们两位的cmets,现在我对这个问题有了更好的理解。我通过将可用总和作为最大值和 0.01 作为最小值来随机生成下一个查询的可用价格,从而增加了更多“随机性”。

标签: mysql


【解决方案1】:

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

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

该算法基于以下内容:

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

步骤:

  1. 随机选择价格
  2. 随机选择价格
  3. 随机选择价格

重复此操作并获得 (TOTAL - 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多