我已经准备了一个MySQL语句,它给了我一个“朋友建议”。
表格/结果如
suggestion_id | suggestion_count
suggestion_count
告诉我有多少“我的”朋友在他们的朋友中有suggestion_id
。
换句话说,它告诉了有多少“我的”朋友有这个共同的朋友。
目标是从此结果中选择一些随机行。
请注意,目标不只是ORDER BY RAND()
...
但是这种随机性应该更频繁地显示suggestion_id
s更多的计数,
但不是每一次。
目标是选择随机建议,但更常见的是那些suggestion_count
更高的建议。
我被困在ORDER BY RAND()
部分 - 是兰德()以某种方式可以设置吗?
有什么建议吗?
答案 0 :(得分:2)
您正在寻找加权随机样本。
RAND()
函数返回0到1之间的值。因此,您需要根据suggestion_count的值生成一个随机数。
这个怎么样?
ORDER BY (100.0*RAND()) - LEAST(100,suggestion_count)
这给出了一个随机数,即您的suggestion_count值越高,该数字越小。它基于猜测100是一个很大的suggestion_count值。
修改强>
我随意选择了一个100作为最大的" suggestion_count的值。我的小公式是这样的:
suggestion_count
值。因此,如果suggestion_count
在一行中为10而在另一行中为20,则具有20的行比ORDER BY
操作中的10行更有可能出现。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)
如果您在MAX()
子句中仅使用ORDER BY
,则将整个查询转换为单行聚合查询,因为MAX()
是一个聚合函数。