mysql - 如何在考虑优先级系统时查询 MYSQL 表中的随机记录

标签 mysql sql

我的 table 看起来像这样

ID   | Priority
---------------
#1   | 25
#2   | 50
#3   | 125
#4   | 300
#5   | 500

对于每 1000 个查询,我希望(平均)检索 ID #1 25 次、#2 50 次、#3 125 次等。

我的表将有 1000 条记录,最终会超过 100,000 条记录,是否可以扩展它?

此查询会运行得非常频繁,因此它也需要在大型表中运行得非常快。

如果有更有效的方法,我绝对愿意重新考虑表结构 - 有什么建议吗?

最佳答案

我认为您将很难找到能够在非常大的数据集上特别好地扩展的查询。

实际上有两条路径可供您选择:

  1. 像您一样使用权重表,然后将此权重乘以每一行的随机数。
  2. 计算表中每个 ID 的记录数以反射(reflect)您的权重。例如#2 的可能性是#1 的两倍,因此#1 有 1 条记录而#2 有两条记录。如果#3 的可能性是#2 的四倍,那么它将有 8 条记录,等等。这种方法有一个非常非常大的缺点——如果#4 的可能性是#1 的一半,那么唯一的解决办法就是将数字加倍每个其他类型都有的记录,然后为 #4 插入一条记录。跟踪起来非常非常困惑。

考虑到这一点,这里有一个使用方法 1 的解决方案:

SELECT ID
FROM tablename
ORDER BY (RAND() * Priority) DESC
LIMIT 1;

(我不是 100% 确定语法,因为我是 SQL Server/Oracle 负责人,而不是 MySQL,但我认为这是正确的。)

关于mysql - 如何在考虑优先级系统时查询 MYSQL 表中的随机记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7155924/

相关文章:

mysql - MySQL 中何时使用单引号、双引号和反引号

MySQL Group By 和 Sum 其它列的总值

mysql - 刚刚开始 ROR Lynda 教程,尝试执行 Rails 服务器时出错

mysql - 如何对单个空格进行字符串比较

php - 如果断言失败,如何让 PHPUnit 执行某些操作

php - 按连续小时获取sql

PHP 数组作为单独的行插入到 MySQL 表中

python - 从字典列表中选择具有特定字段值的项目(类似于 SQL SELECT 命令)

sql - Sequelize 包含来自不同数据库模式的模型

通过 SUM 的 MySQL 嵌套 AVG