zoukankan      html  css  js  c++  java
  • MYSQL 随机数据获取

     以下方法是前提WHERE为空的时候,当存在WHERE的时候效率非常低..

    网上目前流窜着各种取数据的方法,除了

    SELECT s . * , rand( ) AS r
    FROM ko_stars AS s
    ORDER BY r
    LIMIT 5 

    这种超低效率的方法外,好像都存在数据量获取小于指定值的现象,因为网上的普遍方法是随机一个最小ID获取连续的5个记录,但这个最小ID没做好判断,网上版本如下:

    SELECT * 
    FROM `tableAS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2 
    WHERE t1.id >= t2.id 
    ORDER BY t1.id LIMIT 1;

    根据需求的实际情况,本人加已改版

    "SELECT t.*
        FROM `${table}` AS t JOIN (
            SELECT 
                @maxid:=ifnull((FLOOR(RAND() * (SELECT MAX(id) FROM `${table}` as t where ${where}))),0),
                @lid:=ifnull((select id from ${tableas t where ${whereorder by id desc limit ".(${show}-1).",1),0),
                (if(@maxid-@lid>0,@lid,@maxid)+0as id
            ) as mt
            WHERE t.id >= mt.id and ${where}
        ORDER BY t.id LIMIT ${show}";

    本质原理跟上面那个差不多,但这个SQL可以保证取出足量的数据,除非你总数都没有${show}的数量多,那样有几个就返回几个

     

  • 相关阅读:
    AWS EC2 优化 CPU 选项
    chrome 向群组中添加标签页
    Hadoop中TeraSort算法分析
    hadoop —— teragen & terasort
    spark本地读取写入s3文件
    将 Spark Streaming 的结果保存到 S3
    ipython notesbook 默认路径修改
    Python操作MongoDB
    python读取excel,数字都是浮点型,日期格式是数字的解决办法
    flask-profiler的使用
  • 原文地址:https://www.cnblogs.com/liushannet/p/2223606.html
Copyright © 2011-2022 走看看