2

我想从表格中间的任何地方选择 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

4 回答 4

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;

一个用于测试的 SQLfiddle

于 2013-02-26T08:16:27.873 回答
1

尝试这个

SELECT * FROM A2 ORDER BY RAND() LIMIT 30

这将选择 30 个随机行。

于 2013-02-26T07:41:14.163 回答
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))) 

否则,当 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;
于 2013-02-26T07:41:44.737 回答
0

我会这样做

SELECT * FROM A2 
WHERE serial > (
    SELECT ROUND(RAND()*(SELECT COUNT(*) FROM A2))
) 
ORDER BY serial
LIMIT 30
于 2013-02-26T08:17:15.083 回答