如何从MySQL中随机选择行进行分页?

时间:2016-02-24 03:22:48

标签: mysql pagination

我需要按一定百分比随机选择表格中的行。当我使用MySQL时,我知道如何随机选择记录,正如我从这个问题中可以看到的那样:how to randomly select rows in SQL,但仍然有一件事缺失:如果我有10000行,百分比是10%,我将从db中选择1000行。我怎样才能对这些行进行分页?

1 个答案:

答案 0 :(得分:0)

如果排序为RAND(),则无法通过添加简单的“LIMIT X,Y”来通过单独的请求进行分页。

1)简单方法:单个用户

一种简单的方法可能是向行中添加一个新字段(整数),然后随机为每个字段分配一个数字,使用该列进行排序,然后应用LIMIT X,Y来提取分页结果。 这里明显的限制是所有行只有1个排序顺序。例如,如果您需要让多个用户从该表中提取不同的结果,它将无法正常工作。

2)更复杂的方法:多用户

如果您需要让多个用户在这些约束下使用此数据库,那么每次用户从这些行请求新的“百分比”时,您都需要“保存”数据库中的选定行。 您需要添加两个表,以便保存每个“百分比请求”并可以单独浏览。 例如:

CREATE TABLE percentage_request (
request_id int AUTO_INCREMENT,
percentage_requested int
);

CREATE TABLE percentage_request_item (
request_id int,
row_id int, /* foreign key pointing to a row */
order_index int /* create your own order index here */
);

每次用户从表中请求新的行百分比时,您都会:

  • 从主表中随机选择行
  • 在表percentage_request中创建一条新记录以跟踪该用户请求
  • 在表percentage_request_item中插入X个记录,指向该特定用户请求中的每个选定行
  • 然后您可以通过以下SQL查询逐页提供所请求的百分比:

例如:

SELECT * 
FROM percentage_request_item
INNER JOIN table_rows ON table_rows.id = percentage_request_item.row_id
WHERE request_id = $user_request_id
ORDER BY order_index ASC
LIMIT 100 OFFSET 0

希望有意义!