mysql - "shuffle"数据库记录表的最佳方法是什么?

标签 mysql ruby-on-rails database random

假设我有一个包含一堆记录的表,我想将这些记录随机呈现给用户。我还希望用户能够来回分页,所以我必须保持某种顺序,至少在一段时间内是这样。

该应用程序基本上只有 AJAX,它对已经访问过的页面使用缓存,所以即使我总是提供随机结果,当用户试图返回时,他也会得到上一个页面,因为它将从本地缓存加载.

问题是,如果我只返回随机结果,可能会有一些重复。每个页面包含 6 个结果,所以为了防止这种情况,我必须做一些类似 WHERE id NOT IN (1,2,3,4 ...) 的事情,我把所有以前的加载的 ID。

该解决方案的巨大缺点是无法在服务器端缓存任何内容,因为每个用户都会请求不同的数据。

替代解决方案可能是创建另一个列来对记录进行排序,并打乱在此处插入时间单位。这里的问题是,我需要为表中的每条记录设置一个序列之外的随机数,这将需要与记录一样多的查询。

如果有任何相关性,我正在使用 Rails 和 MySQL。

最佳答案

试试这个:

mysql> create table t (i int);
mysql> insert into t values (1),(2),(3),(4),(5),(6);
mysql> select * from t order by rand(123) limit 2 offset 0;
+------+
| i    |
+------+
|    6 | 
|    4 | 
+------+
mysql> select * from t order by rand(123) limit 2 offset 2;
+------+
| i    |
+------+
|    2 | 
|    3 | 
+------+
mysql> select * from t order by rand(123) limit 2 offset 4;
+------+
| i    |
+------+
|    5 | 
|    1 | 
+------+

请注意,rand() 函数有一个种子值 (123)。另请注意,如果您重复最后三个查询,每次都会得到相同的结果。

关于mysql - "shuffle"数据库记录表的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4610371/

相关文章:

mysql - 优化大型 MySQL 表中的索引

php - 如何使来自另一个域的用户能够从我的域中搜索记录?

ruby-on-rails - 附加到 content_tag 中的 yield

ruby-on-rails - 为此我应该使用什么 WebSockets 系统?

mysql - Django 中是否有检查数据库完整性的工具?

php - 如何增加mysqli中的字段

mysql - 强制MySQL表中的字段为小写

ruby-on-rails - 城市/国家文本字段验证

MySQL:语句是否缓存在数据库中?

java - 为数据库中的唯一名称创建附加 ID?