gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:55:10 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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

该算法基于以下内容:

In a collection of n positive numbers that sum up to S, at least one of them will be less than S divided by n (S/n)

步骤:

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

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

关于MySQL根据预算生成随机产品列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26744455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com