我想从表格中间的任何位置选择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的第一行。
有人可以帮我写这个查询。
由于
答案 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;
答案 3 :(得分:0)
我会这样做
SELECT * FROM A2
WHERE serial > (
SELECT ROUND(RAND()*(SELECT COUNT(*) FROM A2))
)
ORDER BY serial
LIMIT 30