簡體   English   中英

Laravel根據另一個字段從表中選擇隨機行

[英]Laravel select random rows from table based on another field

有一個包含20000條記錄的words表:

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

我要從此表中隨機選擇400個單詞,但要滿足以下條件:

第一20個字:選擇隨機地從20個字words 1和1000之間具有秩

第二20個字:選擇隨機地從20個字words 1000和2000之間具有秩

等等...

我必須在20個單獨的查詢中執行此操作嗎? 怎么樣? 有沒有更好的辦法?

我正在使用laravel 5.4和Mysql,也歡迎使用原始查詢建議。 謝謝

簡單的方法

使用where子句過濾其排名,然后使用inRandomOrder()和take(20)獲得20個隨機的。

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

艱辛的道路

為了使它們全部集中在一個查詢中,您可以嘗試一些時髦的邏輯,如下所示:

首先:定義一個返回相同表的視圖,但沒有排名,而是具有類別,因此1 <= rank <1000,....的類別1只是為了使下一步更容易

現在我們可以使用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 -random-行-從表/

編輯 :結果分區僅用於sql server。 但是你可以在mysql中做類似的事情

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM