MySQL获取2%的记录

标签 mysql limit

我正在尝试获取 2% 的随机样本记录。

SELECT * FROM Orders
ORDER BY RAND()
LIMIT (SELECT CEIL(0.02 * (SELECT COUNT(*) FROM Orders)));

由于第 3 行,这个给出了语法错误。我做错了什么吗? 或者有更好的方法来获取 n% 的记录吗?

最佳答案

如果您使用的是 MySQL 8+,则 ROW_NUMBER() 提供一个选项:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY RAND()) rn,
              COUNT(*) OVER () cnt
    FROM Orders
)

SELECT *
FROM cte
WHERE 1.0*rn / cnt <= 0.02;

在 MySQL 5.7 及更早版本上,我们可以模拟行号:

SELECT *
FROM
(
    SELECT *, (@rn := @rn + 1) AS rn
    FROM Orders, (SELECT @rn := 0) AS x
    ORDER BY RAND()
) t
CROSS JOIN (SELECT COUNT(*) AS cnt FROM Orders) o
WHERE 1.0*rn / cnt <= 0.02; 

关于MySQL获取2%的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68707594/

相关文章:

mysql - 是否可以索引此mysql查询中的所有字段?

ios - NSMutableDictionary 缓存和/或大小限制

api - 使用 magento API V2 限制结果数量

api - 领英 REST API : Throttle Limit for resource 'Search People' reached at 409 of 100k

MySQL选择尚未选择的地方

php - Ubuntu 亚马逊网络服务 LAMP 堆栈设置

php - json 到 mysql 只插入最后一条记录

php - 限制mysql中的表大小,并在插入新行(超出限制)时删除行#1

PHP - 防止在上传文件期间上传超过 100 KB 的文件,而不是在上传整个文件之后

mysql - 本地主机拒绝连接 wamp windows 10