› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
qmaker
V2EX  ›  MySQL

从数据库中捞取某个字段和为特定值的记录

  •  1
     
  •   qmaker · Sep 11, 2020 · 2760 views
    This topic created in 2205 days ago, the information mentioned may be changed or developed.

    假设表 t_pay 中有一个字段为 amount,int 类型;现在需要从表中随机捞取一批记录,满足 2000>sum(amount)>10000,请问有没有什么好的方法

    9 replies  •  2020-09-11 16:29:52 +08:00
    fuyufjh
        1
    fuyufjh  
       Sep 11, 2020
    是性能关键的场景吗?
    是 --> 用 stored procedure 把结果写到临时表,然后一次 select 读取
    不是 --> 每次 select limit 100,不够就再来一批
    qmaker
        2
    qmaker  
    OP
       Sep 11, 2020
    条件更正 2000>sum(amount)>10000 =》 20000>sum(amount)>10000
    qmaker
        3
    qmaker  
    OP
       Sep 11, 2020
    @fuyufjh 对实时性要求比较高,其实是有多个需求池,比如池 A 要求 sum(amount)≈10000,池 B 要求 sum(amount)≈80000,目前想到的办法是单个记录处理,每条记录取出后丢到某个池里,池蓄满了就接着续下个池,不过单个处理效率感觉还是比较低
    taogen
        4
    taogen  
       Sep 11, 2020 via iPhone
    1. 重复地随机取一批值,可以一次随机取 1 条或者 N 条,放入 list 中。直到 sum 满足条件或者 sum 大了。
    2. 若 sum 满足条件,直接返回。若 sum 大了,使用动态规划找到满足条件的子段和。
    3. 若动态规划找到有效解返回。若找不到有效解,清空 list,跳转到第 1 步。
    taogen
        5
    taogen  
       Sep 11, 2020 via iPhone
    你这个需求不一定有解,可能出现死循环。可以设置最大寻找次数,超过限制次数视为无解,提示暂无数据。
    kkeiko
        6
    kkeiko  
       Sep 11, 2020
    写入数据库的时候,把这个字段作为排序值,其他字段打包 json 写入 redis 的有序集合,redis key 根据一定的业务规则进行 hash,多分一些 key,每次从不同的 key 取出在此范围内的数据,多取一些,再合并,根据某个条件排个序,取前几位,做相对随机的效果。
    rockyou12
        7
    rockyou12  
       Sep 11, 2020
    先开张表记录下单条值的区间分布,然后去拿各个区间内对应的值?
    taogen
        8
    taogen  
       Sep 11, 2020
    @rockyou12 有两个问题。1. 区间的宽度如何设置? 2. 在 1 中设置的区间宽度下,如何选择区间找到有效解的算法是什么?
    rockyou12
        9
    rockyou12  
       Sep 11, 2020
    @taogen 区间好说,先根据业务取细一点,比如总区间是 0-2000,那就以 10 为间隔来取。然后通过类型 flink 这种流计算框架先预计算每个区间的总数,和记录该区间中有哪些值(可以放入 redis 的 hset ),然后整个分布就有了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2334 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:44 · PVG 08:44 · LAX 17:44 · JFK 20:44
    ♥ Do have faith in what you're doing.