MySQL随机行经常出现具有更高计数的行?

时间:2014-07-14 14:35:54

标签: mysql sql random random-sample

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

   suggestion_id   |   suggestion_count

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

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

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

我被困在ORDER BY RAND()部分 - 是兰德()以某种方式可以设置吗?

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

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

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

这个怎么样?

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

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

修改

我随意选择了一个100作为最大的" suggestion_count的值。我的小公式是这样的:

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

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

    编辑我使用了值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()是一个聚合函数。