【问题标题】:MYSQL select rows starting from a random numberMYSQL 从随机数开始选择行
【发布时间】:2013-02-26 07:40:06
【问题描述】:

我想从表格中间的任意位置选择 30 行(按顺序排列)。 我试图通过添加具有唯一auto_increment 序列号的列'serial'来做到这一点。 我的代码是:

SELECT * FROM A2 
     WHERE serial>(
         SELECT ROUND(RAND()*(
              SELECT COUNT(*) FROM A2))
) LIMIT 30

(SELECT ROUND(RAND()*(SELECT COUNT(*) FROM A2))) 部分工作正常,即生成一个从 1 到表中行数的随机数,但完整的查询不起作用。它抛出不连续的行,它几乎总是抛出序列低于 30 的第一行。

谁能帮我写这个查询。

谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这应该可行,假设您的序列号从 0 开始;如果它从 1 开始,只需将 >= 替换为 >

    SELECT A2.*
    FROM A2 
    JOIN (SELECT FLOOR(RAND() * (SELECT COUNT(*)-29 FROM A2)) serial) b
    WHERE a2.serial >= b.serial
    ORDER BY a2.serial
    LIMIT 30;
    

    An SQLfiddle to test with.

    【讨论】:

      【解决方案2】:

      试试这个

      SELECT * FROM A2 ORDER BY RAND() LIMIT 30
      

      这将选择 30 个随机行。

      【讨论】:

      【解决方案3】:

      像这样附加ORDER BY serial

      SELECT * 
      FROM A2 
      WHERE serial > (
          SELECT ROUND(RAND() * (
              SELECT COUNT(*) FROM A2))) 
      ORDER BY serial
      LIMIT 30;
      

      您可能还需要使用FLOOR 而不是ROUND 并从上限中减去30,如下所示:

      WHERE serial > (
          SELECT FLOOR(RAND() * ((SELECT COUNT(*) FROM A2) - 30))) 
      

      否则,当 random 接近表格末尾时,您可能会得到少于 30 行。

      对不起。那个答案是错误的。这对我有用:

      SELECT a2.*
      FROM a2, 
          (SELECT FLOOR(RAND() * ((SELECT COUNT(*) FROM a2) - 30)) AS r) AS r 
      WHERE a2.serial BETWEEN r.r AND r.r + 29;
      

      【讨论】:

      • @user1517108 您确定这些值之间的任何序列值实际存在于表中吗?
      • 是的...我浏览了表格以确保
      • @user1517108 这是我的错。添加了固定变体。
      【解决方案4】:

      我会这样做

      SELECT * FROM A2 
      WHERE serial > (
          SELECT ROUND(RAND()*(SELECT COUNT(*) FROM A2))
      ) 
      ORDER BY serial
      LIMIT 30
      

      【讨论】:

      • 这个解决方案也不起作用。
      猜你喜欢
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 2012-02-05
      相关资源
      最近更新 更多