有一个words
包含 20000 条记录的表:
ID name rank
1 word1 3
2 word2 5019
3 word3 12334
4 word4 23
5 word5 544
我想从这张表中随机选择 400 个单词,但条件是:
前 20 个单词:从words
1 到 1000 之间随机选择 20 个单词
第二个20词:从words
1000到2000之间随机选择20个词
等等...
我是否必须在 20 个单独的查询中执行此操作?如何?有没有更好的办法?
我正在使用 laravel 5.4 和 Mysql,也将不胜感激原始查询建议。谢谢
使用 where 子句过滤他们的排名,然后使用 inRandomOrder() 和 take(20) 来获得 20 个随机的。
Word::inRandomOrder()->where('rank', '>=', 1)->where('rank', '<=', 1000)->take(20);
要在一个查询中获得它们,您可以尝试一些像这样的时髦逻辑:
第一:定义一个返回相同表的视图,但不是排名,而是有类别,所以类别 1 for 1<=rank<1000, .... 只是为了让下一步更容易
现在我们可以使用 partition by (请参阅尝试了解 over() 和 partition by)。请记住按分区内的 RAND() 排序。按行号对所有这些的结果进行排序。
现在我们有一个看起来像这样的结果:
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 -随机行从表/
编辑:原来 partition by 仅适用于 sql server。但是你可以在 mysql 中做类似的事情
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句