随机选择相邻行组

时间:2016-11-21 13:48:47

标签: mysql

我有一张巨大的桌子,我想随机选择一组行。

经典随机查询(SELECT * FROM table ORDER BY RAND() LIMIT 1000; )选择不相邻的行,但我想选择n行的随机组S(在我的图片中n = 3rows)。 以下图片仅为示例,每次执行时行都是随机的。 https://github.com/npm/npm/issues/8872

2 个答案:

答案 0 :(得分:0)

假设langids是连续的,您可以选择一个SELECT ... WHERE id>3*r and id<=3*(r+1)组,其中r是从1到MAX(id)/3的随机整数。将r乘以3可确保不会重叠任何组。

您可以按SELECT DISTINCT CAST(langid/3 AS INT)创建临时表或子查询,随机排序,然后选择前N个,然后加入此表。

考虑一下

SELECT id, name, @rank:=@rank+1 AS rank, CAST(rank/3 AS INT) AS groupid FROM
(SELECT id, name FROM Objects) z, (SELECT @rank:=0) zz;

此结果集将为Objects表中的行提供新的连续ID,因此我们不必假设有关其实际主键的任何内容。 groupid为群组编制索引。

在此设置中,您可以随机选择任意数量的groupid,然后为每个选定的groupid找到原始主键。

答案 1 :(得分:0)

不完美 - 但可能适合您的目的......

SELECT * FROM my_table;

+-----+
| id  |
+-----+
|   1 |
|   2 |
|   3 |
...
| 188 |
| 189 |
| 190 |
| 191 |
...
| 253 |
| 254 |
| 255 |
| 256 |
+-----+

SELECT DISTINCT a.* FROM my_table a JOIN (SELECT * FROM my_table ORDER BY RAND() LIMIT 10) b ON b.id BETWEEN a.id AND a.id+2 ORDER BY id;
+-----+
| id  |
+-----+
|   1 |
|  31 |
|  32 |
|  33 |
| 108 |
| 109 |
| 110 |
| 144 |
| 145 |
| 146 |
| 166 |
| 167 |
| 168 |
| 199 |
| 200 |
| 201 |
| 202 |
| 203 |
| 204 |
| 225 |
| 226 |
| 227 |
| 232 |
| 233 |
| 234 |
| 246 |
| 247 |
| 248 |
+-----+
28 rows in set (0.00 sec)