随机选择相邻行的组
问题描述:
我有一个巨大的表,我想随机选择一组行。随机选择相邻行的组
经典的随机查询(SELECT * FROM table ORDER BY RAND() LIMIT 1000;
)选择不相邻的行,但我想要(在我的图像n = 3rows)选择n行的随机组。 下面的图片就是一个例子,每行执行时都是随机的。
答
假设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:[email protected]+1 AS rank, CAST(rank/3 AS INT) AS groupid FROM
(SELECT id, name FROM Objects) z, (SELECT @rank:=0) zz;
此结果集将给新连续的ID在Objects
表中的行,所以我们不必承担其实际主键东西。 groupid
索引组。
从这个集合中,您可以随机选择任意数量的groupid
s,然后为每个选定的groupid找到原始主键。
+0
听起来很有希望 - 但我无法从这个想象的飞跃到答案 – Strawberry
答
不完美的 - 但也许足以满足您的目的...
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)
所以,我们可以说,你想退回以下几点:1随机行中,由其他至少两排互相分离(所以,在上面的例子中可能是2,8,16,20和31)。 2.紧接在这个数据集之前和之后的行。 – Strawberry
hmm .... 1000/3让我们剩下999行就足够了?或者你想要1行只有1条记录?所以我们可以随机选择333条记录,只需从所选ID中拉+1和-1(但这会允许重叠。是否允许重叠? – xQbert
@Strawberry,这些行是完全随机的,分离是随机的 – user2997418