2016-11-21 84 views
1

我有一个巨大的表,我想随机选择一组行。随机选择相邻行的组

经典的随机查询(SELECT * FROM table ORDER BY RAND() LIMIT 1000; )选择不相邻的行,但我想要(在我的图像n = 3rows)选择n行的随机组。 下面的图片就是一个例子,每行执行时都是随机的。 enter image description here

+0

所以,我们可以说,你想退回以下几点:1随机行中,由其他至少两排互相分离(所以,在上面的例子中可能是2,8,16,20和31)。 2.紧接在这个数据集之前和之后的行。 – Strawberry

+0

hmm .... 1000/3让我们剩下999行就足够了?或者你想要1行只有1条记录?所以我们可以随机选择333条记录,只需从所选ID中拉+1和-1(但这会允许重叠。是否允许重叠? – xQbert

+0

@Strawberry,这些行是完全随机的,分离是随机的 – user2997418

回答

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:[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

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)