Laravel 根据另一个字段从表中选择随机行

艾哈迈德·莫巴拉基

有一个words包含 20000 条记录表:

ID      name      rank
1       word1     3 
2       word2     5019 
3       word3     12334 
4       word4     23
5       word5     544

我想从这张表中随机选择 400 个单词,但条件是:

前 20 个单词:words1 到 1000 之间随机选择 20 个单词

第二个20词:words1000到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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Laravel验证规则,如果值存在于另一个字段数组中

获取我从多个选择框中选择的所有ID并更新另一个表-Laravel

Laravel至少需要一个字段

Laravel根据另一个字段的值来验证该字段

根据最早出现的另一个字段选择一行值

选择案例/根据另一个字段更新一个字段

Laravel Validator Facade-根据另一个字段值验证大小

在laravel的另一个表中,从ID为json格式的表中选择值

在Laravel 5.8中验证多维数组时是否可以使用另一个字段的值?

如何使用Laravel模型从另一个表中没有ID的表中选择记录?

包含日期和时间的字段未与Laravel中的另一个字段进行比较

Laravel验证,如果另一个字段为0,则字段应为1,反之亦然

Laravel查询构建器-从另一个表中选择前1行

Laravel验证:如果另一个字段可用,则需要两个字段中的任何一个

Laravel Eloquent:选择一个字段等于另一个字段的记录

Laravel 5.6:将不同的表单字段值传递到另一个字段的验证中

如何通过急于在Laravel中加载来选择另一个表中的字段

从另一个表的另一个字段中选择表中的字段

从表中选择,其中列从laravel中的另一个表中选择

Laravel 5.1当一个方法中需要一个字段而另一个方法中不需要字段时,如何对两个方法使用相同的表单请求规则?

从两个表中选择结果,但在另一个表上选择一个字段

Laravel更新字段,带有另一个字段值

如何在显示表中设置另一个字段而不是 Laravel BackPack 中关系字段中的 id?

如何在 Laravel 中将值从一个表单字段转移到另一个字段?

Laravel Nova 在创建时使用另一个字段的内容填充字段

Laravel 验证规则 required_if 另一个字段值在数组中,不起作用

Laravel Nova 中另一个表的字段

如果laravel中的另一个字段不为空,如何为一个字段制定验证规则

Laravel 查询其中字段小于相关表中另一个字段的总和(多态关系)