gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:41:45 26 4
gpt4 key购买 nike

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

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

我想从此表中随机选择 400 个单词,但条件如下:

前 20 个单词:从排名在 1 到 1000 之间的 单词 中随机选择 20 个单词

第二个20个单词:从排名在1000到2000之间的单词中随机选择20个单词

等等...

我必须在 20 个单独的查询中执行此操作吗?如何?有更好的办法吗?

我正在使用 laravel 5.4 和 Mysql,如果有原始查询建议,我们将不胜感激。谢谢

最佳答案

简单的方法

使用 where 子句过滤它们的排名,然后使用 inRandomOrder() 和 take(20) 获得 20 个随机值。

Word::inRandomOrder()->where('rank', '>=', 1)->where('rank', '<=', 1000)->take(20);

艰难的道路

要在一个查询中获取所有这些内容,您可以尝试一些像这样的时髦逻辑:

首先:定义一个返回同一个表的 View ,但不是排名,而是有类别,因此类别 1 代表 1<=rank<1000,...只是为了使下一步更容易

现在我们可以使用分区方式(参见Trying to understand over() and 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-random-rows-from-table/

编辑:原来分区依据仅适用于sql server。但你可以在 mysql 中做类似的事情

关于php - Laravel 根据另一个字段从表中选择随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45345188/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com