【问题标题】:MySQL random rows with more often occurrence of rows with higher count?MySQL随机行更频繁地出现计数更高的行?
【发布时间】:2014-09-04 12:23:55
【问题描述】:

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

   suggestion_id   |   suggestion_count

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

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

我们的目标是随机选择建议,但更多的是那些suggestion_count 较高的建议。

我被困在ORDER BY RAND() 部分 - RAND() 是否可以为此设置?

有什么建议吗?

【问题讨论】:

  • 我的错,我误读了您的帖子.. 以为您在获得更高的结果后想要 rand()... 感谢您指出 :)
  • @JohnRuddell NP :) 很高兴我们现在互相了解了 :)

标签: mysql sql random random-sample


【解决方案1】:

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

RAND() 函数返回一个从 0 到 1 的值。因此,您需要根据建议计数的值生成一个随机数。

这个怎么样?

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,则在 ORDER BY 操作中,带有 20 的行比带有 10 的行更有可能首先出现。
  3. 但是如果在suggest_count中有超过100的行,它会压倒随机数并且每次都排在第一位。所以我们将这个数字 100 用于所有大的 suggestion_count 值。这就是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() 是一个聚合函数。

【讨论】:

  • 我已经测试了几次,它似乎可以工作,您能否解释一下“这是基于猜测 100 是一个很大的建议计数值”?它会在最大建议数超过 100 的情况下工作吗?
  • 我可以用MAX(suggestion_count) 替换order by 中的100 吗?之后它会正常工作吗?
  • 是的,您可以使用MAX(suggestion_count)。这可能会很好用。好主意。
  • 我试过了,但它似乎不起作用(它开始只返回 1 行 - 总是相同的)你知道如何正确实现 MAX() 到查询吗? :)
猜你喜欢
  • 1970-01-01
  • 2011-06-08
  • 2021-06-27
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
相关资源
最近更新 更多