You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用MySQL查询获取表中前50%的记录?

如何在MySQL中动态获取User表的前50%记录

这个需求太常见了——当表的记录数随时变化时,硬写死LIMIT的数值完全没法满足动态取前50%的要求。下面给你两种适配不同MySQL版本的实用解决方案:

方案一:使用窗口函数(MySQL 8.0及以上版本首选)

从MySQL 8.0开始支持窗口函数,这是最简洁优雅的实现方式。我们可以用ROW_NUMBER()给每条记录分配一个唯一序号,同时用COUNT(*) OVER()获取表的总记录数,最后筛选出序号≤总记录数一半的行:

SELECT *
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER() AS row_num,
        COUNT(*) OVER() AS total_rows
    FROM User
    -- 如果你需要按特定字段排序后取前50%,在这里加上ORDER BY,比如:ORDER BY create_time DESC
) AS temp
WHERE row_num <= FLOOR(total_rows / 2);

这里用FLOOR()是取整数部分(比如总记录数101的话,取前50条),如果想要向上取整(总记录数101取前51条),把FLOOR换成CEIL即可。

方案二:子查询计算总数(适配MySQL 5.7及以下版本)

对于不支持窗口函数的旧版本MySQL,我们可以先通过子查询获取总记录数,计算出50%的数量后,再用LIMIT获取结果:

SELECT *
FROM User
-- 同样,需要排序的话记得加上ORDER BY子句
LIMIT (SELECT FLOOR(COUNT(*)/2) FROM User);

如果你的MySQL版本不支持LIMIT后面直接跟子查询(比如部分5.7早期版本),可以用变量来实现:

SET @half_count = (SELECT FLOOR(COUNT(*)/2) FROM User);
SELECT * FROM User ORDER BY id LIMIT @half_count;

重要提醒

不管用哪种方案,一定要加上ORDER BY子句!如果不指定排序规则,MySQL会按照数据的存储顺序返回结果,这通常不是你想要的逻辑(比如按创建时间、ID排序后再取前50%才更有业务意义)。

内容的提问来源于stack exchange,提问作者Hirein

火山引擎 最新活动