Laravel根据另一个字段

时间:2017-07-27 08:23:46

标签: php mysql laravel random

有一个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,另外一个原始的查询建议将不胜感激。谢谢

1 个答案:

答案 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中做类似的事情