MySQL 随机行中出现次数较多的行?

标签 mysql sql random

我已经准备好了一个MySQL语句,它给我一个“ friend 建议”。
表格/结果如下

   suggestion_id   |   suggestion_count

suggestion_count 告诉有多少“我的” friend 在他们的 friend 中拥有 suggestion_id
换句话说,它告诉了有多少“我的” friend 有这个共同的 friend 。

目标是从此结果中选择一些随机行。
请注意,目标不仅仅是ORDER BY RAND()...
但是这种随机性应该更频繁地显示计数更多的 suggestion_id, 但不是每次都如此。

目标是选择随机建议,但更常见的是选择 suggestion_count 较高的建议。

我陷入了 ORDER BY RAND() 部分 - RAND() 是否可以为此设置?

有什么建议吗?

最佳答案

您正在寻找加权随机样本。

RAND() 函数返回 0 到 1 之间的值。因此,您需要根据 suggest_count 的值生成一个随机数。

这个怎么样?

ORDER BY (100.0*RAND()) - LEAST(100,suggestion_count)

这会给出一个随机数,您的 suggest_count 值越高,该随机数越小。它基于 100 是一个很大的 suggest_count 值的猜测。

编辑

我随意选择了 100 作为 suggest_count 的“最大”值。我的小公式是这样的:

  1. 对于表中的每一行,它都会生成一个 0-100 范围内的随机数。
  2. 然后从中减去该行的 suggestion_count 值。因此,如果 suggestion_count 在一行中为 10,在另一行中为 20,则在 ORDER BY 中,具有 20 的行比具有 10 的行更有可能首先出现> 操作。
  3. 但是如果suggestion_count中有一行超过100,它就会压倒随机数,每次都会排在第一位。因此,我们对所有较大的 suggestion_count 值使用数字 100。这就是 LEAST() 的目的。

我希望这有助于解释我的程序。

编辑 我使用值 100 因为使用 MAX(suggestion_count) 编码和调试有点困难。为此,您需要一个更复杂的查询,也许像这样。 但这不会直接为您工作,因为我不知道您的表格到底是什么样子。

SELECT a.suggestion_id
  FROM suggestions AS a
  JOIN ( SELECT MAX(suggestion_count) FROM suggestions) AS maxsug) AS b
 ORDER BY (maxsug*RAND()) - LEAST(maxsug,a.suggestion_count)

如果您在 ORDER BY 子句中仅使用 MAX(),则会将整个查询变成单行聚合查询,因为 MAX() 是一个聚合函数。

关于MySQL 随机行中出现次数较多的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24739025/

相关文章:

php - 格式化php查询结果

php - 我的 php 代码中 undefined offset 1 - 如何避免它?

sql - 如何使用PROC SQL查找数值变量的长度

MySQL schedule update 语法错误?

sql - 如何在MySQL中随机选择八个项目,每个项目都符合特定条件?

PHP - rand(1,1000) = 1000 的概率与 rand(1,1000) = rand(1,1000) 的概率一样吗?

java - 为使用 jdbc 的应用程序编写测试用例

php - Mac OS X - 重新安装 Apache/PHP/MySQL 服务器的全新/干净副本

php - 通过 jquery 显示 html 选择(来自 PHP)?

sql - 在 Oracle 中,使用 1=1 启动 SQL 查询的 WHERE 子句有用吗?