【发布时间】: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