我有一个包含100行的表。我想从中选择200个项目,使用随机行生成的结果比表中包含以下行的结果更多:
SELECT * FROM `rows` ORDER BY RANDOM() LIMIT 200;
此查询可预测地返回100个结果。有没有办法随机选择多于表中实际包含的内容?
修改
有没有办法在不添加复合join
语句的情况下选择任意数量的记录?例如,如果项目的请求数量(LIMIT
)提前未知或任意大,该怎么办?
答案 0 :(得分:4)
尝试这样的事情
SELECT *
FROM `rows`
cross join `rows`
ORDER BY RANDOM()
LIMIT 200;
答案 1 :(得分:0)
一个选项:
Select * From (
SELECT * FROM `rows`
UNION ALL
SELECT * FROM `rows`
) as alotofrows
ORDER BY RANDOM()
LIMIT 200;
答案 2 :(得分:0)
您应该可以执行以下操作:
select * from rows
union all
select * from rows
order by random()
limit 200
请注意,如果您可以保证表格包含100行,则实际上不需要200限制。
union all
为您提供了两份副本(没有重复删除),然后order by
随机为您提供完整的数据集。
当然,如果你的表包含100,并且你想要更多而不是200,那么你需要处理更多的联合条款。
但是,您可能会发现简单地(更灵活)选择100行,将它们全部放入内存中结构,然后使用代码选择所需的行而不是SQL。
这样可以让你精确控制选择过程,当然比我们为你写的任何“SQL体操”都要好: - )
答案 3 :(得分:0)
我的方法不符合“任意大”的要求,但很容易扩展。
第一个问题是生成N行。在SQLite中我使用了视图。您也可以考虑使用虚拟表。
CREATE VIEW V10 AS SELECT 0 AS Number UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9;
CREATE VIEW V100 AS SELECT V10.Number*10+low.Number AS Number FROM V10 JOIN V10 AS low;
CREATE VIEW V10000 AS SELECT V100.Number*100+low.Number AS Number FROM V100 JOIN V100 AS low;
查询V10000
将从0到9999返回Number
。
现在你可以:
SELECT table.* FROM table JOIN (
SELECT (
SELECT ROWID+Number*0 AS rndid FROM table ORDER BY RANDOM()
) FROM V10000 WHERE Number<200
) ON table.ROWID=rndid;
它是如何运作的?
SELECT
从table
中选择一个随机行并返回其ROWID
,名为rndid
; SELECT
乘以随机行; SELECT
匹配整个table
行并返回rndid
。如果需要超过10000个结果,则可以创建另一个更宽的VIEW
作为之前的结果。
脚注:这是一个纯SQL(迭代)算法。使用某种编程语言,使用重复的TEMP TABLE
行SELECT * FROM
来创建ORDER BY RANDOM() LIMIT 1;
可能是最有效的