You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对posts表最新20条自增ID数据随机抽取4条?

解决方案:从最新20条数据中随机选4条

嘿,这个需求我之前也帮人处理过,给你几个实用的方案,保证结果只从最新的20条里挑,而且效率比全表rand()高多了:

方法一:子查询先取最新20条,再随机筛选(通用推荐)

这是最稳妥的方式,不管你的id有没有被删除过(是否连续)都能准确拿到最新20条,然后在这个小数据集里做随机排序:

SELECT id, name, photo, text 
FROM (
    -- 先获取最新的20条数据(按自增id倒序取前20)
    SELECT id, name, photo, text 
    FROM posts 
    ORDER BY id DESC 
    LIMIT 20
) AS latest_posts
-- 在这20条里随机排序,取前4条
ORDER BY RAND()
LIMIT 4;

为什么推荐这个?

  • 避免了对全表1000条数据执行RAND(),性能提升明显;
  • 逻辑清晰,不管id是否连续,都能确保只从最新的20条里选结果;
  • 即使后续数据量变大(比如到10万条),这个查询依然高效,因为子查询只取20条数据。

方法二:直接用id范围筛选(仅适用于id连续的情况)

如果你的posts表从来没删除过数据,id是严格从1到1000连续的,那可以直接用id范围来筛选:

SELECT id, name, photo, text 
FROM posts 
WHERE id >= 980  -- 1000-20+1=980,刚好覆盖最后20个id
ORDER BY RAND()
LIMIT 4;

注意事项

这个方法虽然简单,但只适用于id完全连续的场景。如果中间有数据被删除(比如id=990被删了),那这个范围会包含超过20条数据(或者不足),就不符合你的需求了。

方法三:动态计算最新20条的id范围(灵活适配非连续id)

如果想兼顾灵活性和性能,可以先获取当前最大的id,再计算出最新20条的最小id:

SELECT id, name, photo, text 
FROM posts 
-- 动态计算最新20条的起始id:最大id减去19,刚好覆盖20条数据
WHERE id >= (SELECT MAX(id) - 19 FROM posts)
ORDER BY RAND()
LIMIT 4;

优势

这个方法和方法一效果类似,但不需要子查询嵌套,语法更简洁。同样适用于id不连续的场景,确保拿到的是最近插入的20条数据。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:45:59