基于其他一些值的Mysql RAND()函数

基于其他一些值的Mysql RAND()函数,mysql,sql,mariadb,Mysql,Sql,Mariadb,我有以下表格结构: id | product | value -----+---------+-------- 1 | test1 | 10 -----+---------+-------- 2 | test2 | 30 -----+---------+-------- 3 | test3 | 25 -----+---------+-------- 4 | test4 | 20 -----+---------+-------- 5 |

我有以下表格结构:

  id | product | value
-----+---------+--------
  1  |  test1  |  10
-----+---------+--------
  2  |  test2  |  30
-----+---------+--------
  3  |  test3  |  25
-----+---------+--------
  4  |  test4  |  20
-----+---------+--------
  5  |  test5  |  15
-----+---------+--------
  6  |  test6  |  35
-----+---------+--------
这是我想向我的用户推荐的一些产品,我有兴趣在我的主页上展示4个产品(不是全部),这是最有价值的产品,只有一个例外

所以通常我想一直显示这些产品:
test6、test2、test3、test4
。唯一的问题是,我想时不时地展示一些其他产品,但价格较低。所以,如果我不想要这个,我可能会
按值排序desc
。但问题是,我不想让我的用户对一直看到相同的4种产品感到厌烦,我希望不时在我的列表中插入一到两种其他产品

现在我知道mysql有一个RAND()函数,但我不知道如何使用它来创建一个查询,以完全满足我的需要

实际上,它应该是这样工作的:

我们将所有值加在一起,即
10+30+25+20+15+35=135
,我们应用三分法查看每个产品的随机率

135 = 100%
------------
10  = 7.4%
30  = 22.2%
25  = 18.5%
20  = 14.8%
15  = 11.1%
35  = 25.9%
所以考虑到这个百分比,我想做一个查询,它将返回一个使用random的4个产品的列表,但也考虑到哪个产品有更多的机会根据这些百分比apear


不要问我尝试了什么,因为我不是mysql专家,我知道如何在PHP中做到这一点,但我想知道,如果仅使用mysql,这是否可行,以及我如何做到这一点。

您可以使用变量做到这一点。取累积总和,将其标准化,然后使用
rand()

上述情况可以简化。此外,可以多次重新计算按排序的rand()。我认为这样更好:

select t.*
from (select t.*, (@v := @v + value) as running_value, rand() as rnd
      from t cross join
           (select @v := 0) params
     ) t 
order by (rnd between (t.running_value - t.value)/@v and t.running_value/@v) desc;
编辑:

现在我在考虑它,
orderby
中的二进制结果是非常正确的排序依据。这适用于选择一行,但不一定适用于排序

我认为这是一个更好的方法:

select t.*
from (select t.*, rand() as rnd
      from t 
     ) t 
order by rnd * t.value desc;

谢谢你的快速回复。我试试这个。一个小问题。这是推荐的还是使用php更快?我的意思是,你鼓励我使用这个查询吗?第二个查询应该和用php查询一样好或者更好;查看与您的MariaDB服务器版本对应的手册,了解第6行“desc”附近使用的正确语法为什么在我的cpanel中有MySQL®数据库时会出现MariaDB错误,而这正是我创建MySQL数据库的部分?该死,这是一个不错的sql
select t.*
from (select t.*, rand() as rnd
      from t 
     ) t 
order by rnd * t.value desc;