【问题标题】:LIMIT then RAND rather than RAND then LIMITLIMIT 然后 RAND 而不是 RAND 然后 LIMIT
【发布时间】:2011-02-08 12:53:15
【问题描述】:

我正在使用全文搜索来提取行。
我根据分数 (ORDER BY SCORE) 对行进行排序,然后在前 20 行 (LIMIT 20) 中,我想对结果集进行 rand (RAND)。

所以对于任何特定的搜索词,我想随机显示前 20 个结果中的 5 个。

我的解决方法是基于代码的——我将前 20 个放入一个数组中,然后随机选择 5 个。

有没有 sql 方法可以做到这一点?

【问题讨论】:

    标签: mysql limit random


    【解决方案1】:

    您可以使用内部选择来执行此操作。在内部选择中选择前二十行。在外部选择中随机排列这些行并选择前五名:

    SELECT *
    FROM (
        SELECT *
        FROM table1
        ORDER BY score DESC
        LIMIT 20
    ) AS T1
    ORDER BY RAND()
    LIMIT 5
    

    【讨论】:

    • 对 MySQL 中的每一行 RAND 的评估是否不同? (我问是因为在 SQL Server 中你必须使用 NEWID)
    • +1 另一种解决方法是双嵌套查询(@gbn:是的)
    • @gbn: ORDER BY RAND() combined with LIMIT is useful for selecting a random sample from a set of rows 来自dev.mysql.com/doc/refman/5.0/en/…
    • 只订购 20 行而没有键可能不会引起用户注意,而且您不会将未使用的行发送给客户端。
    • 如果有 21 个人得分相同,则第 21 个人可能永远不会显示。删除内部 LIMIT 会更公平,但这会降低你的性能。只是想一想。你可以告诉他们,为了保证在墙上占有一席之地,他们需要击败高分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2018-07-04
    • 2015-10-06
    • 1970-01-01
    相关资源
    最近更新 更多