我有一张巨大的桌子,我想随机选择一组行。
经典随机查询(SELECT * FROM table ORDER BY RAND() LIMIT 1000;
)选择不相邻的行,但我想选择n行的随机组S(在我的图片中n = 3rows)。
以下图片仅为示例,每次执行时行都是随机的。
https://github.com/npm/npm/issues/8872
答案 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)