【问题标题】:how to select n random rows in mysql from subset of large table?如何从大表的子集中选择 mysql 中的 n 个随机行?
【发布时间】:2010-07-08 14:47:05
【问题描述】:

我知道有this question很相似,但我想补充一下我的具体情况,看看答案是否不同。

我读到您可以简单地执行 ORDER BY RAND() ,但这对于大型表来说是个坏主意。但是,我可以使用 WHERE 子句将我的行数限制为最多 160 行。所以问题是,WHERE 子句是否在 ORDER BY RAND() 之前进行评估和处理,从而使其成为可接受的解决方案?

我的场景是我正在实现一个纸牌游戏。我有一张牌桌和一张牌桌。我试图从deck_cards 表中简单地抽取n 张随机卡片。每个游戏都有一个单独的牌组,因此当玩家抽 n 张牌时,我知道它来自特定牌组,因此建议的查询是

select id
from deck_cards
where deck_id = ? and draw_pile = true
order by rand()
limit 5

draw_pile 列就是它听起来的样子,我会跟踪卡片在 draw_pile 或 discard_pile 中的位置。

顺便说一句,我在 rails 中执行此操作,并尝试使用 Array.sort_by { rand } 对结果进行洗牌,但我看到有证据表明 rails rand 并不是完全随机的。所以另一个问题是在 SQL 或 rails 中尝试 random 函数是否更好。目前,我在 SQL 中没有 ORDER BY RAND 或 Limit。我在 rails 中对结果数组进行洗牌,然后从那个洗牌的数组中弹出 n 张牌。但同样,我看到的结果表明洗牌并不是真正随机洗牌。

另一个问题/解决方案可能是表锁定。这是一款多人实时游戏应用程序。偶尔我会看到超过 1 名玩家抽到同一张牌。我假设这是来自玩家同时绘图并点击此查询和随机播放,它们以某种方式返回重叠结果。

【问题讨论】:

    标签: mysql ruby-on-rails random


    【解决方案1】:

    “所以问题是,WHERE 子句是否在 ORDER BY RAND() 之前进行评估和处理,从而使其成为可接受的解决方案?”

    是的。

    order by 只是一个游标,它说明数据应按什么顺序从集合中检索。

    【讨论】:

      【解决方案2】:

      我认为使用子查询将在 WHERE 之前处理 ORDER BY

      select id
      from deck_cards
      where id in (select id
                   from deck_cards
                   where deck_id = ? and draw_pile = true
                )
      order by rand()
      limit 5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多