我已经准备好了一个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 的“最大”值。我的小公式是这样的:
- 对于表中的每一行,它都会生成一个 0-100 范围内的随机数。
- 然后从中减去该行的
suggestion_count
值。因此,如果suggestion_count
在一行中为 10,在另一行中为 20,则在ORDER BY
中,具有 20 的行比具有 10 的行更有可能首先出现> 操作。 - 但是如果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/