有一个words
表,包含20000条记录:
ID name rank
1 word1 3
2 word2 5019
3 word3 12334
4 word4 23
5 word5 544
我想从这张表中随机选择400个单词但是有这个条件:
前20个单词:从words
中随机选择20个单词,排名在1到1000之间
第二个20个字:从words
随机选择20个字,排名在1000到2000之间
等等......
我是否必须在20个单独的查询中执行此操作?怎么样?还有更好的方法吗?
我正在使用laravel 5.4和Mysql,另外一个原始的查询建议将不胜感激。谢谢
答案 0 :(得分:1)
使用where子句来过滤它们的等级,然后使用inRandomOrder()并使用(20)获得20个随机的。
Word::inRandomOrder()->where('rank', '>=', 1)->where('rank', '<=', 1000)->take(20);
要在一个查询中获取它们,您可以尝试这样一些时髦的逻辑:
首先:定义一个返回同一个表的视图,但不是rank,而是有类别,所以类别1为1&lt; = rank&lt; 1000,....只是为了让下一步更容易
现在我们可以使用partition by(参见Trying to understand over() and partition by)。记得在分区内通过RAND()订购。通过rownumber订购所有这些的结果。
现在我们的结果如下:
rownumber name category
1 word1 1
1 word2 2
1 word3 3
1 word4 4
...
2 word21 1
2 word22 2
2 word23 3
2 word24 4
...
20 word381 1
20 word382 2
20 word383 3
20 word384 4
...
通过采用这些元组中的400个,我们将对20个类别中的每一个进行20个随机抽样。
注意 - 由RAND()排序可能很慢,如http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/
所述编辑:仅针对sql server输出分区。但你可以在mysql中做类似的事情