MYSQL从随机数开始选择行

时间:2013-02-26 07:40:07

标签: mysql

我想从表格中间的任何位置选择30行(按顺序排列)。 我想通过添加一个具有唯一serial序列号的“auto_increment”列来实现此目的。 我的代码是:

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

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

有人可以帮我写这个查询。

由于

4 个答案:

答案 0 :(得分:1)

试试这个

SELECT * FROM A2 ORDER BY RAND() LIMIT 30

这将选择30个随机行。

答案 1 :(得分:1)

像这样追加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))) 

否则,当随机接近表格末尾时,您可能会少于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;

答案 2 :(得分: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

答案 3 :(得分:0)

我会这样做

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